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

 

完美

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