1

無制限のキュー (LinkedBlockingQueue) と、CPU の数 (たとえば 4) に設定されたコアと最大プール サイズで構築された ThreadPoolExecutor があります。

私が RejectedExecutionException を取得している間は、すべて素晴らしいです。Executor は実行中の状態です。私の理解では、これは無制限のキューでは発生しないはずです。

デバッガーでこれをキャッチして何が起こっているのかを正確に確認することはできませんでしたが、スタック トレースからは ThreadPoolExecutor.execute のように見え、workQueue.offer が false を返しているため、スピンしようとするビットにジャンプします。新しいスレッドを立てます。ただし、poolSize は既に最大になっているため、拒否された実行例外がスローされます。

これはよくわかりません。

ただし、最大プール サイズをコア プール サイズよりも少し大きくする必要がありますか?

4

2 に答える 2

2
  1. 「無制限の」LinkedBlockingQueueでさえ、実際にはInteger.MAX_VALUEで制限されています。はい、その限界に達している可能性は低いですが、「不可能を排除したら...」。
  2. エグゼキュータがまだ実行状態にあることをどの程度確信していますか?私のソースコードでは、状態のチェックとoffer()呼び出しは両方とも同じ行にあるため、スタックトレースでそれらを区別することはできません。
于 2011-08-31T02:49:01.523 に答える
2

LinkedBlockingQueue.offer()false容量に達したときに戻ります。容量が指定されていない場合は、Integer.MAX_VALUEが使用されます。

これは、プールサイズよりも2147483647多いタスクを追加したときに発生しますか?

于 2011-08-31T02:44:20.493 に答える