【发布时间】:2014-11-22 08:09:06
【问题描述】:
我试图了解使用线程池的优势,我编写了这段代码来查看固定线程池的时间改进。
首先,我将池中的线程数设置为 1,大约需要 920 毫秒,然后我将池中的线程数更改为 2(以及 3、4、5、6、7...)而且用了1200ms,线程并发运行不应该更快吗?
当我将其更改为缓存线程池时,也需要 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);
}
}
}
}
【问题讨论】:
-
尝试提交 100000 个任务,而不是 10 个任务。并且不要让他们将内容打印到
System.out,因为这是同步的(因此一次只有一个线程在打印,否定了线程的任何优势)。 -
@immibis 这里的关键确实是
System.out.println()调用的同步。这一点以及并行处理不会促进任何 I/O 绑定进程的事实。
标签: java multithreading threadpool performance-testing