天天看点

wait、notify、notifyAll的阻塞和恢复

(一)准备

(二)阻塞和恢复

(1)wait方法

wait、notify、notifyAll的阻塞和恢复
wait、notify、notifyAll的阻塞和恢复
wait、notify、notifyAll的阻塞和恢复
wait、notify、notifyAll的阻塞和恢复

  阻塞:这三个方法的调用都会使当前线程阻塞。该线程将会被放置到对该Object的请求等待队列中,然后让出当前对Object所拥有的所有的同步请求。线程会一直暂停所有线程调度,直到下面其中一种情况发生:

    ① 其他线程调用了该Object的notify方法,而该线程刚好是那个被唤醒的线程;

    ② 其他线程调用了该Object的notifyAll方法;

    ③ 其他对象中断/杀死了该线程;

    ④ (这种情况,只针对前两个方法)线程在等待指定的时间后;

  恢复:线程将会从等待队列中移除,重新成为可调度线程。它会与其他线程以常规的方式竞争对象同步请求。一旦它重新获得对象的同步请求,所有之前的请求状态都会恢复,也就是线程调用wait的地方的状态。线程将会在之前调用wait的地方继续运行下去。

(2)notify和notifyAll方法

  notify的作用就是唤醒请求队列中的一个线程,而notifyAll唤醒的是请求队列中的所有线程。

  被唤醒的线程不会马上运行,除非获取了该Object的锁。也就是说,调用notify的线程,在调用notify后,不会像wait一样,马上阻塞线程的运行。而是继续运行,直到相应的线程调度完成或者让出Object的锁。而被唤醒的线程会在当前线程让出Object锁后,与其他线程以常规的方式竞争对象锁(正如上面提到的)。

参考资料:

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

wait、notify、notifyAll的阻塞和恢复
wait、notify、notifyAll的阻塞和恢复

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6141807.html,如需转载请自行联系原作者