写于: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 区别

精彩内容推送,请关注公众号!
最近更新时间: 4/16/2020, 8:37:50 PM