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

 

完美

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章