- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
文件: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
编辑 3:我刚刚意识到第二个序列图将所有箭头指向/same/线程。它们实际上是不同的线程,每次调用。
关于java - 为什么两个 Java 线程(在某些情况下)比一个线程快两倍以上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1447261/
我是一名优秀的程序员,十分优秀!