美文网首页Java 学习日志
四:线程等待和通知

四:线程等待和通知

作者: 知耻而后勇_zjh | 来源:发表于2017-07-31 23:49 被阅读0次

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

相关文章

  • 四:线程等待和通知

    JDK提供了两个非常重要的接口线程等待 wait()方法和通知notify()方法。这两个方法是 Object类方...

  • 06 通知等待机制

    等待-通知机制:如果线程要求的条件不满足,则线程阻塞自己,进入等待状态;当线程要求的条件满足后,通知等待的线程重新...

  • java 多线程概述

    线程 线程优先级 线程的六个状态 守护线程 启动和终止线程 线程间通信 等待/通知机制

  • java多线程学习(四)

    一、线程的等待、通知 等待:Object.wait(), 通知:Object.notify()/Object.no...

  • 三、线程间协调

    父线程开启、中断、等待子线程结束 阻塞等待获取异步线程的执行结果 等待-通知模型,条件不满足休眠等待 Synchn...

  • 多线程并发总结录(三)--线程间协作

    线程的协作 1.线程间通知等待机制是什么? ​ 通知等待机制是指一个线程A 调用了对象O 的wait()方法进...

  • 阻塞状态和等待状态

    面试问题:等待阻塞和锁阻塞有什么区别? 等待是主动的等待,是一个线程等待另一个线程通知调度器一个条件时,该线程进入...

  • 线程等待通知机制

    机制的由来 一 个 线 程 修 改 了 一 个 对 象 的 值, 而 另 一 个 线 程 感 知 到 了 变 化,...

  • 线程间通信

    1 Java经典的等待/通知机制 在java中的等待通知机制就是,一个线程让其他线程从wait方法返回。前提:wa...

  • 再谈ReentrantLock之2

    Condition Lock的等待通知机制,一般这么用: 等待: 通知: await 1.将线程加入到等待队列 先...

网友评论

    本文标题:四:线程等待和通知

    本文链接:https://www.haomeiwen.com/subject/qmjdlxtx.html