该文章翻译自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需要做的事情-例如上下文切换-开销也不会小)。所以还是老话,针对你所要达到的目的来衡量技术的使用永远没错。