线程休眠与让出CPU执行权

105 阅读1分钟

线程休眠:Thread类的静态方法sleep

  • 暂时让出指定时间的CPU执行权,这段时间不参与CPU调度。睡眠时间到后,线程处于就绪状态,参与CPU的调度,获取CPU资源后就可以运行了。
  • 该线程还是拥有监视器资源,即持有的锁还不让出
  • 在睡眠期间,可以调用该线程的interrupt方法中断该线程
Thread t = new Thread(()->{
    try {
        TimeUnit.SECONDS.sleep(10);
        System.out.println("t1 end");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t.start();

try {
    TimeUnit.SECONDS.sleep(2);
    //中断后,这部分代码不再执行
} catch (InterruptedException e) {
    e.printStackTrace();
}

t.interrupt();

结果分析:t线程运行2秒后,被中断了,不再睡眠,直接返回

让出CPU执行权:Thread类的静态方法yield

  • 将当前线程让出自己的CPU剩余时间的使用权,让线程调度器进行下一轮调度

sleep和yield的区别

  • sleep会阻塞一段时间,这段时间线程调度器不会去调度该线程,睡眠时间到后,处于就绪状态,才参与CPU的调度
  • yield让出CPU剩余时间的使用权,处于就绪状态,线程调度器下次调度时有可能还会调度当前线程执行