Java executor にはスレッドのプールがあります。プールの長さが固定されている場合(たとえば8)。アプリケーションが終了しない場合、これら 8 つのスレッドはすべて永久に存続しますか? コードの一部で例外がスローされた場合、プール内のスレッドは停止しますか?
一方、スレッドを終了したい場合、スレッドを終了するにはどうすればよいですか?
Java executor にはスレッドのプールがあります。プールの長さが固定されている場合(たとえば8)。アプリケーションが終了しない場合、これら 8 つのスレッドはすべて永久に存続しますか? コードの一部で例外がスローされた場合、プール内のスレッドは停止しますか?
一方、スレッドを終了したい場合、スレッドを終了するにはどうすればよいですか?
手短に言えば、スレッドには次のライフ サイクル フェーズがあります。
Thread myThread = new Thread();
- スレッドが作成されます。まだ実行されていません。myThread.start()
- スレッドが開始され、そのrun()
メソッドが実行されます。run()
と、スレッドは終了します。スレッドが終了すると、再び開始することはできません。単純なスレッド プールは通常、メソッドwait()
を実行してタスクを待機している N 個のスレッドを開始しrun()
ます。タスクがサブミットされると、スレッド プールのディスパッチャーは、タスクをキューに入れ、スレッドを呼び出してスレッドの 1 つにタスクを渡し、notify()
終了wait()
してスレッドがタスクの実行を開始するようにします。完了すると、スレッドは待機状態に戻ります。
はい、存在する限り、彼らは永遠に生き続けExecutorService
ます。を呼び出してシャットダウンできますExecutorService.shutdown()
。質問の他の部分については、javadocですべて説明されています。
シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、後続のタスクを実行する必要がある場合は、新しいスレッドが代わりに使用されます。
クエリ 1:
プールの長さが固定されている場合(たとえば8)。アプリケーションが終了しない場合、これら 8 つのスレッドはすべて永久に存続しますか? コードの一部で例外がスローされた場合、プール内のスレッドは停止しますか?
固定スレッドプールについて話していると思います。のnewFixedThreadPool API を参照してくださいExecutors
。
public static ExecutorService newFixedThreadPool(int nThreads)
無制限の共有キューで動作する固定数のスレッドを再利用するスレッド プールを作成します。どの時点でも、最大で nThreads スレッドがアクティブな処理タスクになります。すべてのスレッドがアクティブなときに追加のタスクが送信されると、それらのタスクは、スレッドが使用可能になるまでキューで待機します。
シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、必要に応じて後続のタスクを実行するために新しいスレッドが代わりに使用されます。
プール内のスレッドは、明示的にシャットダウンされるまで存在します。
クエリ 2:
スレッドを終了したい場合、スレッドを終了する方法は?
関連するSEの質問を見てください: