欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Tread的yield方法

时间:2023-06-12
一 点睛

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 则不会。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。