[翻译] Java Thread sleep() vs yield() vs wait()

该文章翻译自http://www.logicaltrinkets.com/wordpress/?p=153(也许会被墙)

 

这三个方法最终都要归结到操作系统的调度机制上,其实也就是针对进程和线程的时间片调度上。

 

.sleep(n)方法这样理解:“嘿,OS老大,我已经结束了我当前时间片里的活,而且你在n微秒内不要再给我安排其他活了”。OS就会在其请求的n毫秒内不再去调度这个被sleep的线程。

 

.yield()方法这样理解:“嘿,OS老大,我已经结束了我当前时间片里的活,但是我还有其他活要去干”。 OS会去做选择:要么再分配CPU时间片给这个yield的线程,要么去把这个线程所放弃的时间片分给其他线程。

 

.wait()方法这样理解:“嘿,OS老大,我已经结束了我当前时间片里的活,而且在有人用notify()叫我之前不要再给我安排其他活了“。 这样的话,和sleep一样,OS在有其他线程去调用notify(或者有其他一些唤醒场景发生时)之前就不会去调度这个线程干活了。

 

线程在执行一些阻塞IO操作或少部分其他情况时也会丢失一些其剩余的时间片。 如果一个线程占用了整个的CPU时间片,OS会强制去取回CPU控制权,这时候就好像yiled()被调用了一样,这种情况下可以保证其他进程可以运行。

 

线程在执行一些阻塞IO操作或少部分其他情况时也会丢失一些其剩余的时间片。 如果一个线程占用了整个的CPU时间片,OS可以强制去取回CPU控制权,这时候就好像yiled()被调用了一样,这种情况下可以保证其他进程运行。

 

总的来说,yield极少会被调用,除非你的应用含有那种需要极大CPU计算量的业务线程,这时调用一下yield得话*可能*可以提升一些你系统得响应能力(但是作为代价,一些OS需要做的事情-例如上下文切换-开销也不会小)。所以还是老话,针对你所要达到的目的来衡量技术的使用永远没错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值