我试图了解java线程如何与CPU核心协同工作。我有一个4核CPU,当我尝试在代码下运行时,执行时间很有趣。为什么它不会加速多线程?我做错了吗?
availableProcessors()顺便返回4.
下面的代码需要将近27秒;
Runnable runnable = new Runnable() {
@Override
public void run() {
int x = 0;
while(x < 10000000){
System.out.println(x);
x++;
}
}
};
Thread t1 = new Thread(runnable);
t1.start();
当我使用多个线程时需要33秒;
Runnable runnable = new Runnable() {
@Override
public void run() {
int x = 0;
while(x < 5000000){
System.out.println(x);
x++;
}
}
};
Runnable runnable2 = new Runnable() {
@Override
public void run() {
int x = 5000000;
while(x < 10000000){
System.out.println(x);
x++;
}
}
};
Thread t1 = new Thread(runnable);
t1.start();
Thread t2 = new Thread(runnable2);
t2.start();
答案 0 :(得分:4)
您的程序有一个连续的瓶颈,正在打印到终端。
System.out.println
中有一个同步块,因此一次写入一个,因此您的代码不是并行的。
程序的顺序部分(包括协调)根据Amdahl's law
来控制其性能