写于:2019-12-23
一、sleep 对比 yield
JDK 1.5 前的版本,yield 方法事实上调用了 sleep(0),但他们之间存在本质的区别,如下:
- 1、sleep 会导致当前线程暂停指定的时间,没有 CPU 时间片的消耗。
- 2、yield 只是对 CPU 调度器的一个提示,如果 CPU 调度器没有忽略这个提示,它会导致线程上下文切换
- 3、sleep 会使线程短暂 block,会在给定的时间内释放 CPU 资源。
- 4、yield 会使 RUNNING 状态的 Thread 进入 RUNNABLE 状态(如果 CPU 调度器没有忽略这个提示的话)
- 5、sleep 机会百分百的完成了给定时间的休眠,而 yield 的提示并不能一定担保
- 6、一个线程 sleep 另一个线程调用 interrupt 会捕获中断信息,而 yield 则不会。
二、isInterrupted 对比 interrupted
案例代码不带有阻塞方法调用,防止阻塞方法对 中断标志位复位影响测试结果 参考:《阻塞的线程被中断后,中断标志会被复位》
直接来看两者的代码
public class Thread implements Runnable {
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
private native boolean isInterrupted(boolean ClearInterrupted);
}
从代码能够得知:
interrupted 和 isInterrupted 调用的是同一个 isInterrupted(boolean) 方法。
不同的是,interrupted 的 ClearInterrupted = true,isInterrupted 的 ClearInterrupted = false;
下面通过一个简单的例子,来看看 interrupted 和 isInterrupted 区别