gpt4 book ai didi

Tread 的 yield 方法

转载 作者:知者 更新时间:2024-03-13 07:34:15 24 4
gpt4 key购买 nike

一 点睛

yiled 方法属于一种启发式的方法,它会提醒调度器我愿意放弃当前的 CPU 自由,如果 CPU 的资源不紧张,则会忽略这种提醒。

调用 yield 方法会使当前线程从 RUNNING 状态切换到 RUNNABLE 状态,一般这个方法不太常用。

二 实战

1 代码 

package concurrent;

import java.util.stream.IntStream;

public class ThreadYield {
    public static void main(String[] args) {
        IntStream.range(0, 2).mapToObj(ThreadYield::create).forEach(Thread::start);
    }

    private static Thread create(int index) {
        return new Thread(() -> {
//            if (index == 0) {
//                Thread.yield();
//            }
            System.out.println(index);
        });
    }
}

2 测试

上面的程序运行很多次,会发现输出结果不一致,有时候是打印0,有时候是打印1。

打开注释后再运行,会发现输出结果还是不一致,有时候是打印0,有时候是打印1。

3 说明 

一般情况下,因为第一个线程如果先获得了 CPU 资源,它会比较谦虚,主动告诉 CPU 调度器释放原本属于自己的资源,但是 yield 只是一个提示( hint ),CPU 调度器并不会保证每次都能满足 yield 提示。

yield 对程序并不可控,所以这个方法一般不太常用。

三 yield 和 sleep 的对比

  • sleep 会导致当前线程暂停指定的时间,没有 CPU 时间片的消耗。
  • yield 只是对 CPU 调度器的一个提示,如果 CPU 调度器没有忽略这个提示,它会导致线程上下文的切换。
  • sleep 会使线程短暂 block,会在指定的时间内释放 CPU 资源。
  • yield 会使 RUNNING 状态的 Thread 进入 RUNNABLE 状态(如果 CPU 调度器没有忽略这个提示的话)
  • sleep 几乎百分之百地完成给定时间的休眠,而 yield 的提示并不能一定担保。
  • 一个线程 sleep 另一个线程调用 interrupt 会捕获到中断信号,而 yield 则不会。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com