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 * * @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 就绪状态,然后调度执行其它线程 // 通过有无让出代码观察n的变化快慢 Thread.currentThread().yield(); log.debug(" running....{}", n); } }, "t2"); MyThreadUtil.sleep(1); t1.start(); t2.start(); } }

完美