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

案例代码不带有阻塞方法调用,防止阻塞方法对 中断标志位复位影响测试结果 参考:《阻塞的线程被中断后,中断标志会被复位》

直接来看两者的代码

  1. public class Thread implements Runnable {
  2. public static boolean interrupted() {
  3. return currentThread().isInterrupted(true);
  4. }
  5. public boolean isInterrupted() {
  6. return isInterrupted(false);
  7. }
  8. private native boolean isInterrupted(boolean ClearInterrupted);
  9. }

从代码能够得知:

interrupted 和 isInterrupted 调用的是同一个 isInterrupted(boolean) 方法。

不同的是,interrupted 的 ClearInterrupted = true,isInterrupted 的 ClearInterrupted = false;

下面通过一个简单的例子,来看看 interrupted 和 isInterrupted 区别
01.png