2021-08-03,同事接手我写的代码, 看到我到处建线程池。很诧异的问:我建这么多线程干毛?逻辑核心数是固定的,你建这么多执行任务也不会变快,咋不用公共线程池?
甚至想把我建的线程池都删掉!
接着给我一顿分析:并行的线程数是固定的,一个任务的执行时间也是固定,得出结论耗时=任务数/并行数*单个任务执行时间;那么一个线程池跟多个线程池完全没有区别!
然而事实真的是这样吗?超起键盘当场撸代码给他看。
首先看单个线程池的情况:
public static final ThreadPoolExecutor pool =
new ThreadPoolExecutor(20, 20, 5, TimeUnit.MINUTES, new ArrayBlockingQueue<>(20));
public static void main(String[] args) throws InterruptedException {
int task = 40;
CountDownLatch latch = new CountDownLatch(task);
long startTime = System.currentTimeMillis();
//投递40个阻塞任务
for (int i = 0; i < task; i++) {
pool.execute(() -> {
try {
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
latch.await();
System.out.println("cost time:" + (System.currentTimeMillis() - startTime));
}
执行结果如下: