7

ThreadPoolExecutorのタスク キューのサイズを変更できる必要があります。もちろん、BlockingQueue はサイズの変更をサポートしておらず、ThreadPoolExecutor はキューの変更をサポートしていません。

したがって、私が思いついた方法は、ThreadPoolExecutor.shutdownNow()を使用することです。これにより、まだ実行されていない Runnables のリストが返されます。次に、必要なキュー サイズで新しいエグゼキュータを作成し、すべてのタスクを再送信します。

この問題は、shutdownNow() 呼び出しの時点で進行中のタスクにあります。javadoc からわかる限り、executor は現在タスクを実行しているすべてのスレッドで Thread.interrupt() を呼び出します。タスクが殺されたくありません。この質問は、Thread.interrupt() が効果を発揮しないようにタスクを作成する方法を尋ねる、長々とした方法だったのかもしれません。

4

2 に答える 2

3

「shutdown()」(shutdownNow() ではない) を組み合わせて使用​​し、getPoolSize()/isTerminated() でポーリングすると、(a) 既存のプールを停止できます。次に、(b)同時に(別のスレッドで)必要なサイズの新しいキューを作成できます。ここではトレードオフがあります: 必要な数よりも多くのスレッドが一時的に存在することを許可できますか (最初のプールがシャットダウンしている間)。

于 2013-03-02T14:46:23.870 に答える
0

Executor の状態を確認するには isTerminated() メソッドを使用する必要がありますが、isTerminated メソッドを呼び出す前に、shutdown() を呼び出す必要があることを確認してください。

于 2013-03-02T14:56:06.353 に答える