我试图了解使用线程池的优势,我编写了这段代码来查看固定线程池的时间改进。
首先,我将池中的线程数设置为1,大约需要920毫秒,然后我将池中的线程数更改为2(和3,4,5,6,7 ......)它花了1200毫秒,当线程同时运行时不应该更快吗?
当我将其更改为缓存的线程池时,它也需要1200毫秒
package threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Example3 {
public static void main(String[] args) {
new Example3();
}
public Example3() {
try {
testFixedPool(1);
//testFixedPool(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void testFixedPool(int numberOfThreads) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
long start = System.currentTimeMillis();
executor.execute(new TaskPrintInteger(0, 10000));
executor.execute(new TaskPrintInteger(1, 10000));
executor.execute(new TaskPrintInteger(2, 10000));
executor.execute(new TaskPrintInteger(3, 10000));
executor.execute(new TaskPrintInteger(4, 10000));
executor.execute(new TaskPrintInteger(5, 10000));
executor.execute(new TaskPrintInteger(6, 10000));
executor.execute(new TaskPrintInteger(7, 10000));
executor.execute(new TaskPrintInteger(8, 10000));
executor.execute(new TaskPrintInteger(9, 10000));
executor.shutdown();
while(!executor.isTerminated()){
}
System.out.println();
System.out.println((System.currentTimeMillis()) - start);
}
private class TaskPrintInteger implements Runnable {
private int number, times;
public TaskPrintInteger(int number, int times) {
this.number = number;
this.times = times;
}
@Override
public void run() {
for (int i = 0; i < times; i++) {
System.out.println(number);
}
}
}
}
答案 0 :(得分:5)
你要求很多线程都进行一项活动,这很可能(虽然不能保证)synchronized
:
System.out.println(number);
让我们假设您有一个person
,并且要求她写一个&#34;一个&#34;在一张纸上10次,每行一个字。
现在,你需要写一个&#34;一个&#34;和&#34;两个&#34;在一张纸上每次10次,每行一个字;哪个更快?
我猜想第一种选择会更快。
想象一下同样的场景,5个人都试图写出他们的单词10,000次?混沌?是的!
如果您希望从线程中看到真正的改进,那么任务应该完全隔离而不需要同步。特别是没有IO!
答案 1 :(得分:1)
当你有一个满足的资源时,最佳线程数可以是1.写入控制台是昂贵的和单线程的,所以当你使用多个线程时,你增加了开销,而不是让你的程序更快。线程在独立运行时效果最佳。