经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
多线程 Thread.yield 方法到底有什么用?
来源:cnblogs  作者:Java技术栈  时间:2018/11/20 10:41:34  对本文有异议

概念

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

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

  1. /**
  2. * A hint to the scheduler that the current thread is willing to yield
  3. * its current use of a processor. The scheduler is free to ignore this
  4. * hint.
  5. *
  6. * <p> Yield is a heuristic attempt to improve relative progression
  7. * between threads that would otherwise over-utilise a CPU. Its use
  8. * should be combined with detailed profiling and benchmarking to
  9. * ensure that it actually has the desired effect.
  10. *
  11. * <p> It is rarely appropriate to use this method. It may be useful
  12. * for debugging or testing purposes, where it may help to reproduce
  13. * bugs due to race conditions. It may also be useful when designing
  14. * concurrency control constructs such as the ones in the
  15. * {@link java.util.concurrent.locks} package.
  16. */
  17. public static native void yield();

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

实战

下面是一个使用示例。

  1. /**
  2. * 微信公众号:Java技术栈
  3. */
  4. public static void main(String[] args) {
  5. Runnable runnable = () -> {
  6. for (int i = 0; i <= 100; i++) {
  7. System.out.println(Thread.currentThread().getName() + "-----" + i);
  8. if (i % 20 == 0) {
  9. Thread.yield();
  10. }
  11. }
  12. };
  13. new Thread(runnable, "栈长").start();
  14. new Thread(runnable, "小蜜").start();
  15. }

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

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

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

  1. 栈长-----29
  2. 栈长-----30
  3. 小蜜-----26
  4. 栈长-----31

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

  1. 栈长-----28
  2. 栈长-----29
  3. 栈长-----30
  4. 栈长-----31

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

  1. thread1.setPriority(Thread.MIN_PRIORITY);
  2. 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),关注公众号在后台回复 "多线程" 可获取更多,转载请原样保留本信息。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号