java多线程之sleep 与 yield 区别


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 

* sleep 与 yield 区别 * sleep * 1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞) * 2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException * 3. 睡眠结束后的线程未必会立刻得到执行 * yield * 1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程 * 2. 具体的实现依赖于操作系统的任务调度器 *

*/ @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 *

* 测试结果 * 由于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(); } }

完美