zoukankan      html  css  js  c++  java
  • 4.等待和通知

    等待和通知

    Object对象提供了wait( ) 方法和 notify ( ) 方法。

    wait( )方法需要配对着synchronized 关键字使用。

    当一个线程的资源调用 wait( )方法时,它会失去锁,然后进入等待序列。

    当其他线程调用notify方法时才会重新激活。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notify();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    notify( )方法只会随机激活等待序列中的一个线程,而notifyAll( )方法激活所有等待的线程。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notify();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    结果分析:

    两个WaitThread线程只被唤醒了一个。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class NotifyAndWait{
    
        private static Object object = new Object();
    
    
        static class WaitThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("WaitThread Start!");
                try {
                    System.out.println("Object wait!!!");
                    synchronized (object) {
                        object.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("WaitThread Finish!");
            }
        }
    
        static class NotifyThread extends Thread{
    
            @Override
            public void run() {
                System.out.println("NotifyThread Start!");
                System.out.println("Object notify");
                synchronized (object) {
                    object.notifyAll();
                }
                System.out.println("NotifyThread Finish!");
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
            new WaitThread().start();
    
            new WaitThread().start();
    
            TimeUnit.SECONDS.sleep(5);
    
            new NotifyThread().start();
    
        }
    }
    
    
    
    

    运行结果:

    WaitThread Start!

    Object wait!!!

    WaitThread Start!

    Object wait!!!

    NotifyThread Start!

    Object notify

    NotifyThread Finish!

    WaitThread Finish!

    WaitThread Finish!

    结果分析:

    notifyAll( )方法会唤醒处在等待序列中的所有线程。

  • 相关阅读:
    POJ--3164--Command Network【朱刘算法】最小树形图
    金典 SQL笔记(6)
    hdoj1106排序
    linux程序设计——运行SQL语句(第八章)
    iOS-UITextView-文本输入视图的使用
    HDU 5305 Friends(简单DFS)
    Android IntentService全然解析 当Service遇到Handler
    概要设计的要点
    DispatcherTimer
    原型模式
  • 原文地址:https://www.cnblogs.com/TimerHotel/p/thread04.html
Copyright © 2011-2022 走看看