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方法使得线程进入阻塞状态,睡眠时间结束后,再进入就绪状态。