gpt4 book ai didi

java - 为什么两个 Java 线程(在某些情况下)比一个线程快两倍以上?

转载 作者:行者123 更新时间:2023-12-04 12:55:19 26 4
gpt4 key购买 nike

文件:Example1.java

public class Example1 implements Runnable {

public void run() {
for(int i = 0; i < 100000000; i++) {
int x = 5;
x = x * 4;
x = x % 3;
x = x + 9000;
x = x * 923;
}
}

public static void task() {
for(int i = 0; i < 100000000; i++) {
int x = 5;
x = x * 4;
x = x % 3;
x = x + 9000;
x = x * 923;
}
for(int i = 0; i < 100000000; i++) {
int x = 9;
x = x * 2;
x = x % 4;
x = x + 3241;
x = x * 472;
}
}

public static void main(String[] args) {

long startTime = System.currentTimeMillis();
Example1.task();
Example1.task();
Example1.task();
Example1.task();
Example1.task();
long stopTime = System.currentTimeMillis();
long runTime = stopTime - startTime;
System.out.println("Run time for one thread: " + runTime);


startTime = System.Example1();
(new Thread(new Example1())).start();
(new Thread(new Example2())).start();
(new Thread(new Example1())).start();
(new Thread(new Example2())).start();
(new Thread(new Example1())).start();
(new Thread(new Example2())).start();
(new Thread(new Example1())).start();
(new Thread(new Example2())).start();
(new Thread(new Example1())).start();
(new Thread(new Example2())).start();
stopTime = System.currentTimeMillis();
runTime = stopTime - startTime;
System.out.println("Run time for two threads: " + runTime);


}

}

文件:Example2.java

public class Example2 implements Runnable {

public void run() {
for(int i = 0; i < 100000000; i++) {
int x = 9;
x = x * 2;
x = x % 4;
x = x + 3241;
x = x * 472;
}
}
}

当我运行它时,它输出:

Run time for one thread: 1219

Run time for two threads: 281

或非常接近的东西。

为什么会有这样的差异?为什么将其拆分为两个线程比直接运行它快两倍以上?

最佳答案

您实际上根本没有在等待线程完成。

启动线程后,您必须对其调用 .join() 以等待其完成。这里发生的事情是你所有的线程都开始了,一旦最后一个线程开始,你就给它计时,然后计算停止时间。这意味着您的线程仍在后台运行。

编辑:第一个花费这么长时间的原因是因为您正在进行一系列同步调用,同时创建一个线程并启动它会产生一个异步任务。

编辑 2:这是第一次测试中发生的事情的餐巾纸序列图: http://www.websequencediagrams.com/cgi-bin/cdraw?lz=TWFpbi0-RXhhbXBsZTE6IFRhc2sgc3RhcnRlZAphY3RpdmF0ZSAAGAgKACEILS0-TWFpbjogZG9uZQpkZQAYEgABWAABWAABgTFlMQo&s=napkin

这是第二次测试中发生的事情的餐巾纸序列图: http://www.websequencediagrams.com/cgi-bin/cdraw?lz=TWFpbi0tPkFub255bW91cyBUaHJlYWQ6IFN0YXJ0IEV4YW1wbGUxLnRhc2soKQoACSYyAAEuAAFdAAGBOwCCPjoAgyIGPk1haW46ICJIb3cgbG9uZyBkaWQgdGhhdCB0YWtlPyIKAINmEC0AKwhUYXNrcyBiZWdpbiB0byBmaW5pc2guLi4gKHNvbWUgbWF5IGhhdmUgZW5kZWQgZWFybGllcikK&s=napkin

编辑 3:我刚刚意识到第二个序列图将所有箭头指向/same/线程。它们实际上是不同的线程,每次调用。

关于java - 为什么两个 Java 线程(在某些情况下)比一个线程快两倍以上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1447261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com