四:线程等待和通知

JDK提供了两个非常重要的接口线程等待 wait()方法和通知notify()方法。这两个方法是 Object类方法,也就意味着任何对象都可以调用这两个方法。
如果一个线程调用了wait()方法,那么他就会进入 object 对象的等待队列,在这个等待队列中,可能会有多个线程,因为系统运行多个线程同时等待某一个对象。当notify()被调用时,它就会从这个等待队列中,随机挑选一个线程,将其唤醒。还有一个类似的 notifyAll()方法,它和 notify() 功能基本一致,唯一不同的是它会唤醒所有等待的线程。
不过需要注意的是,无论是 wait()或者 notify()都需要首先获得目标对象的一个监视器,wait()释放锁,而notify()不会释放锁。

/**
 * Created by zhangjianghong on 2017/7/31.
 */
public class SimpleWN {
    final static Object object =  new Object();

    public static class T1 extends Thread {
        @Override
        public void run() {
            synchronized (object){
                System.out.println(System.currentTimeMillis() + ": T1 Start! ");
                try {
                    System.out.println(System.currentTimeMillis() + ": T1 wait for Obj! ");
                    object.wait();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis()+": T1 end ! ");
            }
        }
    }

    public static class T2 extends Thread {
        @Override
        public void run() {
            synchronized (object){
                System.out.println(System.currentTimeMillis() + ": T2 Start! notify one thread ");
                object.notify();
                System.out.println(System.currentTimeMillis()+": T2 end ! ");
                try {
                    Thread.sleep(2000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        Thread t1 = new T1();
        Thread t2 = new T2();

        t1.start();
        t2.start();
    }

}

线程2 在执行object.notify()后并不会立即释放锁,而是等执行完毕再释放锁,即使它已经通知了线程一。所以会有以下结果。

07C0A82F-7759-4008-893E-793A46CC80A7.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容