1.背景
面试中经常会被问到:
sleep 与 yield 区别
2.代码
直接看代码吧!
package com.ldp.demo01; import com.common.MyThreadUtil; import lombok.extern.slf4j.Slf4j; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 01/16 9:17 * @description <P> * sleep 与 yield 区别 * sleep * 1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞) * 2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException * 3. 睡眠结束后的线程未必会立刻得到执行 * yield * 1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程 * 2. 具体的实现依赖于操作系统的任务调度器 * </P> */ @Slf4j public class Test02 { /** * sleep * * @param args */ public static void main01(String[] args) { Thread t1 = new Thread(() -> { try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } }, "t1"); t1.start(); MyThreadUtil.sleep(1); // 打断正在睡眠的线程,其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException t1.interrupt(); } /** * yield * <p> * 测试结果 * 由于t2中执行了Thread.currentThread().yield(),t2中循环的数要少很多 * * @param args */ public static void main(String[] args) { Thread t1 = new Thread(() -> { int n = 0; while (true) { n++; log.debug("running....{}", n); } }, "t1"); Thread t2 = new Thread(() -> { int n = 0; while (true) { n++; // 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程 // 通过有无让出cup观察n的变化快慢 Thread.currentThread().yield(); log.debug(" running....{}", n); } }, "t2"); MyThreadUtil.sleep(1); t1.start(); t2.start(); } }