私はJavaマルチスレッドが初めてです。ExecutorService
分析するために大量のWebページをダウンロードするために使用しています。shutdown()
現在、私のアプローチは、すべての Callables を送信し、Future オブジェクトをループ内のリストに配置してから、 andを呼び出しawaitTermination()
、最後に将来のリストを処理することです。
私の質問は私の場合ですが、shutdown()
このように将来のリストを埋めた後に入れてもよろしいですか? Future の時点get()
で、タスクが完了するまで既にブロックされているため、すべての Future の処理が終了したら、代わりに呼び出す必要があるようです。
3 に答える
のjavadocに注意してくださいshutdown()
以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。すでにシャットダウンされている場合、呼び出しによる追加の効果はありません。
これはきれいな停止です。送信されたタスクは、完了するまで実行されます。あなたも持っているawaitTermination()
ので
シャットダウン要求の後、すべてのタスクの実行が完了するか、タイムアウトが発生するか、または現在のスレッドが中断されるかのいずれかが最初に発生するまでブロックします。
メソッドFuture#get()
呼び出しはすぐに返されます (awaitTermination()
タイムアウトしなかった場合)。あなたがしていることに問題はありません。
タスクが永久に実行されないようにしてください。
使用後にシャットダウンすると、スレッドプールを使用しても意味がありません。スレッドを再利用できるように設計されています。
代わりに、をExecutor
静的フィールドに入れます (または、Spring のような DI フレームワークを使用して挿入することをお勧めします)。次に、送信したすべてのタスクが完了するjava.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>>)
までブロックする を使用します。