【发布时间】:2018-12-25 03:20:35
【问题描述】:
我正在为一些愚蠢的简单事情而苦苦挣扎......
我的实际项目多年来一直遇到一个未知问题,因此我决定创建一个非常简单的测试,但结果让我感到害怕......
这是测试:
ExecutorService t = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(600));
for (int i = 0; i < 100; i++) {
final int i1 = i;
t.execute(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println(i1);
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
我正在创建一个线程池,其中包含 10 个核心线程加上 20 个 maximumPoolSize
然后我给它 100 个线程,每个线程将简单地打印一个固定数字...
我的卑鄙愚蠢的想法是:
该池有 10 个线程,将随机打印 0-9,然后在一些 将创建 10 个额外线程,池将从 0-19 打印 随机的
这对我来说有点明显,因为 maxSize 是 20,在最坏的情况下它应该接受 20 个任务......
但结果是永远打印 0-9
问题是:如果从未安排额外线程执行,maximumPoolSize 的意义何在?
【问题讨论】:
-
一点也不傻,这样做是合乎逻辑的方式,sun 选择仅在队列已满时使用
maximumPoolSize,更多详情请参阅here -
我永远猜不到,这完全违反直觉......当明显的愿望是最大化吞吐量时,他们似乎“愿意”打击 quere 容量......你能指出我太阳的一个优势吗方式?
-
只有 Doug Lea 真正知道(如果他记得的话)。这个想法来自他 1998 年的 PooledExecutor 课程,当时 CPU 和 jvm 非常不同,当队列已满时,也许使用额外的线程作为最后的手段是有意义的。最后一条评论here 以一种明智的方式解释了它。
标签: java multithreading threadpool threadpoolexecutor