多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?

2026-04-19 11:081阅读0评论SEO问题
  • 内容介绍
  • 相关推荐

本文共计471个文字,预计阅读时间需要2分钟。

多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?

在阅读《Java多线程编程核心技术与最佳实践》第1.9节时,这里讲述了yield方法对多线程执行速度带来的影响。个人在电脑上测试了一些小demo,并记录了学习过程。

测试案例1:不使用yield方法

测试结果表明,不使用yield方法时,线程的执行速度并没有明显提升。

在阅读《Java多线程编程核心技术》中的第1.9这里讲到了yield方法对于多线程执行的速度带来的影响。个人在电脑上测试了一下小小demo,做一下学习过程记录。

测试案例1:不使用yield方法来执行50000000个数字的求和操作。

测试案例1代码如下:

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { // Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); } } class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } }

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); }

}

class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } 执行后本地用时记录为29毫秒!

多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?

现在试一下如果是使用yield,让其在sleep的时候让出cpu,这样的执行情况: 测试案例代码2:

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); } } class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } }

测试案例2的执行结果如下图所示:

可以明显看到,将CPU让给其他资源会导致速度明显变慢。

==yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。==

本文共计471个文字,预计阅读时间需要2分钟。

多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?

在阅读《Java多线程编程核心技术与最佳实践》第1.9节时,这里讲述了yield方法对多线程执行速度带来的影响。个人在电脑上测试了一些小demo,并记录了学习过程。

测试案例1:不使用yield方法

测试结果表明,不使用yield方法时,线程的执行速度并没有明显提升。

在阅读《Java多线程编程核心技术》中的第1.9这里讲到了yield方法对于多线程执行的速度带来的影响。个人在电脑上测试了一下小小demo,做一下学习过程记录。

测试案例1:不使用yield方法来执行50000000个数字的求和操作。

测试案例1代码如下:

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { // Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); } } class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } }

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); }

}

class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } 执行后本地用时记录为29毫秒!

多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?

现在试一下如果是使用yield,让其在sleep的时候让出cpu,这样的执行情况: 测试案例代码2:

public class MyThread extends Thread { @Override public void run(){ long beginTime = System.currentTimeMillis(); int count = 0; for (int i = 0; i < 50000000; i++) { Thread.yield(); count = count + (i + 1); } long endTime = System.currentTimeMillis(); System.out.println("用时:" + (endTime - beginTime) + "毫秒!"); } } class Run{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } }

测试案例2的执行结果如下图所示:

可以明显看到,将CPU让给其他资源会导致速度明显变慢。

==yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。==