16.4.4 线程让步 yield
yield
方法是一个和sleep
方法有点相似的方法,它也是Thread
类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。 yield
只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield
方法暂停之后,线程调度器又将其调度出来重新执行。
实际上,当某个线程调用了yield
方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。
程序示例
下面程序使用yield
方法来让当前正在执行的线程暂停。
1 | public class YieldTest extends Thread |
上面程序中的代码0调用yield
静态方法让当前正在执行的线程暂停,让系统线程调度器重新调度。由于程序中代码1、代码2处于注释状态。
此时两个线程的优先级完全一样
,所以当一个线程使用yield
方法后,另一个线程就会开始执行。运行结果如下所示:
1 | ... |
如果将程序中代码1
和代码2
的注释取消,也就是为两个线程分别设置不同的优先级,则程序的运行结果如下所示:
1 | .... |
线程让步后,由线程调度器选中就绪状态
中的一个线程来执行,优先级高的线程被选中的机会比较大,但也只是机会大而已,低优先级的线程依然有可能得到运行。
sleep方法和yield方法的区别
关于sleep
方法和yield
方法的区别如下:
sleep
方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield
方法只会给优先级相同,或优先级更高的线程执行机会。sleep
方法会将线程转入阻塞状态
,直到经过阻塞时间才会转入就绪状态;而yield
不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态
。因此完全有可能某个线程调用yield
方法暂停之后,立即再次获得处理器资源被执行。sleep
方法声明抛出了InterruptedException
异常,所以调用sleep
方法时要么捕捉该异常,要么显式声明抛出该异常;而yiled
方法则没有声明抛出任何异常。sleep
方法比yiled
方法有更好的可移植性,通常不建议使用yield
方法来控制并发线程的执行。
总结
yiled
方法使得线程进入就绪状态
,系统线程调度器重新调度处于就绪状态
的一个线程来运行,因为调用yiled
方法的线程此时也处于就绪状态
,所以该线程可能被线程调度器选中得以再次运行
.sleep
方法使得线程进入阻塞状态
,睡眠时间结束后,再进入就绪状态
。
原文链接: 16.4.4 线程让步yield