在阅读《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时间片。==
