在阅读《Java多线程编程核心技术》中的第1.9这里讲到了yield方法对于多线程执行的速度带来的影响。个人在电脑上测试了一下小小demo,做一下学习过程记录。 测试案例1:不使用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时间片。==