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

    完美

  • 相关阅读:
    C++指针笔记
    破解入门【OllyDebug爆破程序】
    c++类的定义《一》
    数组
    while循环语句的使用
    MS10-046漏洞测试
    For循环语句的使用
    C++Builder编写计算器
    C++自定义函数
    SQLyog简介
  • 原文地址:https://www.cnblogs.com/newAndHui/p/15811368.html
Copyright © 2020-2023  润新知