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