多线程中yield方法对执行速度的影响,是否会导致程序性能显著下降?
- 内容介绍
- 相关推荐
本文共计471个文字,预计阅读时间需要2分钟。
在阅读《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,让其在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分钟。
在阅读《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,让其在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时间片。==

