我不明白这个ThreadPoolExecutor的行为

时间:2011-08-31 01:24:50

标签: java multithreading threadpool executor

我有一个ThreadPoolExecutor,它由一个无界队列(LinkedBlockingQueue)构成,核心和最大池大小设置为cpus(比如4)。

每当我收到RejectedExecutionException时都很棒。执行程序处于运行状态。我的理解是这不应该发生在无限制的队列中。

我无法在调试器中发现这一点以确切地看到发生了什么,但是从ThreadPoolExecutor.execute中看起来像堆栈跟踪,workQueue.offer返回false,所以它跳转到它的位置试图启动新线程。但是poolSize已经处于最大值,因此它会抛出被拒绝的执行异常。

我不太明白这一点。

但是,无论如何,我应该使最大池大小比核心池大小大一点吗?

2 个答案:

答案 0 :(得分:2)

LinkedBlockingQueue.offer()在达到其容量时返回false。如果未指定容量,则使用Integer.MAX_VALUE

添加比池大小更多的任务2147483647时会发生这种情况吗?

答案 1 :(得分:2)

  1. 即使是“无界”的LinkedBlockingQueue实际上也是bounded at Integer.MAX_VALUE。是的,你达到这个限制是不可能的,但是“一旦你消除了不可能的......”。
  2. 执行者还处于RUNNING状态你有多确定?在我的源代码中,状态检查和offer()调用都在同一行,因此您无法在堆栈跟踪中区分它们。