1

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

当我收到 RejectedExecutionException 时,每一次都很棒。Executor 处于运行状态。我的理解是这不应该发生在无界队列中。

我无法在调试器中捕捉到这一点,以查看到底发生了什么,但从堆栈跟踪来看,它看起来像在 ThreadPoolExecutor.execute 中,workQueue.offer 返回 false,所以它跳转到它尝试旋转的位开了一个新话题。但是 poolSize 已经是最大值了,所以它抛出了被拒绝的执行异常。

我不太明白这一点。

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

4

2 回答 2

2

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

当添加的任务比池大小多 2147483647 时,是否会发生这种情况?

于 2011-08-31T02:44:20.493 回答
2
  1. 即使是“无界” LinkedBlockingQueue 实际上也有界 Integer.MAX_VALUE。是的,你不可能达到这个极限,但是“一旦你消除了不可能的事情......”。
  2. 你有多确定 executor 仍处于 RUNNING 状态?在我的源代码中,状态检查和 offer() 调用都在同一行,因此您无法在堆栈跟踪中区分它们。
于 2011-08-31T02:49:01.523 回答