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

 

 

完美

posted @ 2022-01-24 20:16  李东平|一线码农  阅读(165)  评论(0编辑  收藏  举报