我正在努力做一些简单的事情...
我的真实项目多年来一直遭受着一个未知问题的困扰,他们决定创建一个非常简单的测试,结果让我感到害怕...
这是测试:
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个线程,每个线程将简单地打印一个固定的数字...
我愚蠢的想法是:
这对我来说很明显,因为maxSize为20,在最坏的情况下它应该接受20个任务...
但结果是永远打印0-9
问题是:如果永不安排执行额外的线程,那么
maximumPoolSize
的意义是什么? 最佳答案
正如@Oleg指出的那样,该池工作正常,但是有一个我不知道的实现细节。
仅当任务队列为FULL时,才会创建额外的线程
这篇文章更好地解释了:
http://www.bigsoft.co.uk/blog/2009/11/27/rules-of-a-threadpoolexecutor-pool-size
因此,Java等待最后一秒钟,直到队列耗尽以创建新线程...