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

    完美

  • 相关阅读:
    hadoop无法启动常见原因
    mahout版本兼容问题
    递归打印字符串
    斐波那契数列
    int('x', base)中的base参数
    打印的特殊符号
    位置参数,默认参数,非关键字可变长参数,关键字可变长参数
    try...except包含try...finally方法
    7.9 未解答
    对集合应用符号 | & ^
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15840781.html
Copyright © 2020-2023  润新知