wait(),sleep(),notify(),notifyall(),join()

线程的状态

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()的方法。



作者:aeborah
链接:https://www.jianshu.com/p/a3a6a04467e9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值