资讯专栏INFORMATION COLUMN

多线程 Thread.yield 方法到底有什么用?

yzd / 3564人阅读

摘要:那方法是干什么用的呢来看下源码。它让掉当前线程的时间片,使正在运行中的线程重新变成就绪状态,并重新竞争的调度权。运行以上程序,可以有以下两种结果。结果栈长让出了资源,小蜜成功上位。总结栈长没用过,感觉没什么鸟用。

概念

我们知道 start() 方法是启动线程,让线程变成就绪状态等待 CPU 调度后执行。

那 yield() 方法是干什么用的呢?来看下源码。

/**
 * A hint to the scheduler that the current thread is willing to yield
 * its current use of a processor. The scheduler is free to ignore this
 * hint.
 *
 * 

Yield is a heuristic attempt to improve relative progression * between threads that would otherwise over-utilise a CPU. Its use * should be combined with detailed profiling and benchmarking to * ensure that it actually has the desired effect. * *

It is rarely appropriate to use this method. It may be useful * for debugging or testing purposes, where it may help to reproduce * bugs due to race conditions. It may also be useful when designing * concurrency control constructs such as the ones in the * {@link java.util.concurrent.locks} package. */ public static native void yield();

yield 即 "谦让",也是 Thread 类的方法。它让掉当前线程 CPU 的时间片,使正在运行中的线程重新变成就绪状态,并重新竞争 CPU 的调度权。它可能会获取到,也有可能被其他线程获取到。

实战

下面是一个使用示例。

/**
 * 微信公众号:Java技术栈
 */
public static void main(String[] args) {
    Runnable runnable = () -> {
        for (int i = 0; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "-----" + i);
            if (i % 20 == 0) {
                Thread.yield();
            }
        }
    };
    new Thread(runnable, "栈长").start();
    new Thread(runnable, "小蜜").start();
}

这个示例每当执行完 20 个之后就让出 CPU,每次谦让后就会马上获取到调度权继续执行。

运行以上程序,可以有以下两种结果。

结果1:栈长让出了 CPU 资源,小蜜成功上位。

栈长-----29
栈长-----30
小蜜-----26
栈长-----31

结果2:栈长让出了 CPU 资源,栈长继续运行。

栈长-----28
栈长-----29
栈长-----30
栈长-----31

而如果我们把两个线程加上线程优先级,那输出的结果又不一样。

thread1.setPriority(Thread.MIN_PRIORITY);
thread2.setPriority(Thread.MAX_PRIORITY);

因为给小蜜加了最高优先权,栈长加了最低优先权,即使栈长先启动,那小蜜还是有很大的概率比栈长先会输出完的,大家可以试一下。

yield 和 sleep 的异同

1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。

2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。

3)yield 不能被中断,而 sleep 则可以接受中断。

总结

栈长没用过 yield,感觉没什么鸟用。

如果一定要用它的话,一句话解释就是:yield 方法可以很好的控制多线程,如执行某项复杂的任务时,如果担心占用资源过多,可以在完成某个重要的工作后使用 yield 方法让掉当前 CPU 的调度权,等下次获取到再继续执行,这样不但能完成自己的重要工作,也能给其他线程一些运行的机会,避免一个线程长时间占有 CPU 资源。

动手转发给更多的朋友吧!

更多 Java 多线程技术文章请在Java技术栈微信公众号后台回复关键字:多线程。

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "多线程" 可获取更多,转载请原样保留本信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72301.html

相关文章

  • Thread类源码解读(2)——线程状态及常方法

    摘要:如果线程还存活,线程就无限期等待,并让出监视器锁,进入状态。当线程从状态被唤醒后通过,或者是假唤醒将继续竞争监视器锁,当成功获得监视器锁后,他将从调用的地方恢复,继续运行。 前言 系列文章目录 上一篇我们讨论了线程的创建,本篇我们来聊一聊线程的状态转换以及常用的几个比较重要的方法。 本篇依然是通过源码分析来了解这些知识。 本文源码基于jdk1.8 。 阅读完本文,你应当有能力回答以...

    luqiuwen 评论0 收藏0
  • 一文搞懂 Java 线程中断

    摘要:判断目标线程是否被中断,会清除中断标记。技术栈线程休眠被中断,程序退出。示例全部信息输出并正常退出,只是在方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。通过以上个中断示例,相信对线程中断的概念有了全面的了解。 在之前的一文《如何优雅地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就...

    BDEEFE 评论0 收藏0
  • 线程编程:wait, notify, join, yield

    摘要:通知任一一个进入等待状态的线程,通知所有让调用线程阻塞在这个方法上,直到的线程完全执行完毕,调用线程才会继续执行。通知调度器,主动让出对的占用。 多线程在开发知识中是一个很重要的部分,然而实际生产中却很少遇到真正需要自己去处理多线程编程里的那些复杂细节和问题,因为很多时候,都有一套架构或者一些框架帮大部分业务程序员隐藏了多线程的细节,大多时候只需要简单的实现各种业务逻辑即可。 今天来理...

    lovXin 评论0 收藏0
  • Java并发编程之线程线程

    摘要:目标线程由运行状态转换为就绪状态,也就是让出执行权限,让其他线程得以优先执行,但其他线程能否优先执行时未知的。函数的官方解释是意思是使调用该函数的线程让出执行时间给其他已就绪状态的线程。 线程允许在同一个进程中同时存在多个程序控制流,即通过线程可以实现同时处理多个任务的功能。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器、栈以及局部变量。 多线程的实...

    wums 评论0 收藏0

发表评论

0条评论

yzd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<