wait(),sleep(),notify(),notifyal

2021-08-17  本文已影响0人  aeborah

详解:https://www.cnblogs.com/paddix/p/5381958.html

线程的状态

Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。

1.wait()

(1)wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程.
(2)wait(long timeout),在指定时间内,如果没有notify或notifAll方法的唤醒,也会自动唤醒。

注意
1).调用wait方式时必须要获取monitor对象的所有权,只有通过sychronized关键字才可以得到。所以wait必须要sychronized一起使用.
2)调用wait后,会释放所持有的锁,也就是monitor对象。

2.notify()和notifyall()

wait方式是通过对象的monitor对象来实现的,只要在同一对象上去调用notify/notifyAll方法,就可以唤醒对应对象monitor上等待的线程了。notify和notifyAll的区别在于前者只能唤醒monitor上的一个线程,对其他线程没有影响,而notifyAll则唤醒所有的线程

总结:
一个通过wait方法阻塞的线程,必须同时满足以下两个条件才能被真正执行:
    线程需要被唤醒(超时唤醒或调用notify/notifyll)。
    线程唤醒后需要竞争到锁(monitor)

3.sleep()

sleep方法的作用是让当前线程暂停指定的时间(毫秒),唯一需要注意的是其与wait方法的区别,wait方法依赖于同步,而sleep方法可以直接调用。而更深层次的区别在于sleep方法只是暂时让出CPU的执行权,并不释放锁。而wait方法则需要释放锁。

4.yield()

yield方法只是将Running状态转变为Runnable状态.
与wait不同的是,wait是变为blocked状态,需要唤醒并且竞争到锁才可以使用,但是yield方法转化为runnable状态后,可以马上就立刻呗再次执行。

5.join()

join方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。
例如一个父线程里有多个子线程,想让子线程按顺序执行,
就可以采用join()的方法。

上一篇下一篇

猜你喜欢

热点阅读