当前位置 : 主页 > 编程语言 > java >

关于多线程中yield方法对执行速度的影响

来源:互联网 收集:自由互联 发布时间:2023-09-06
在阅读《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毫秒! image.png

现在试一下如果是使用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的执行结果如下图所示: image.png

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

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

上一篇:JDK下载与安装步骤
下一篇:没有了
网友评论