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 * * @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(); } }