1

Java executor にはスレッドのプールがあります。プールの長さが固定されている場合(たとえば8)。アプリケーションが終了しない場合、これら 8 つのスレッドはすべて永久に存続しますか? コードの一部で例外がスローされた場合、プール内のスレッドは停止しますか?

一方、スレッドを終了したい場合、スレッドを終了するにはどうすればよいですか?

4

3 に答える 3

4

手短に言えば、スレッドには次のライフ サイクル フェーズがあります。

  1. Thread myThread = new Thread();- スレッドが作成されます。まだ実行されていません。
  2. myThread.start()- スレッドが開始され、そのrun()メソッドが実行されます。
  3. メソッドが終了するrun()と、スレッドは終了します。スレッドが終了すると、再び開始することはできません。

単純なスレッド プールは通常、メソッドwait()を実行してタスクを待機している N 個のスレッドを開始しrun()ます。タスクがサブミットされると、スレッド プールのディスパッチャーは、タスクをキューに入れ、スレッドを呼び出してスレッドの 1 つにタスクを渡し、notify()終了wait()してスレッドがタスクの実行を開始するようにします。完了すると、スレッドは待機状態に戻ります。

于 2013-02-06T08:28:35.113 に答える
4

はい、存在する限り、彼らは永遠に生き続けExecutorServiceます。を呼び出してシャットダウンできますExecutorService.shutdown()。質問の他の部分については、javadocですべて説明されています。

シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、後続のタスクを実行する必要がある場合は、新しいスレッドが代わりに使用されます。

于 2013-02-06T08:21:54.030 に答える
0

クエリ 1:

プールの長さが固定されている場合(たとえば8)。アプリケーションが終了しない場合、これら 8 つのスレッドはすべて永久に存続しますか? コードの一部で例外がスローされた場合、プール内のスレッドは停止しますか?

固定スレッドプールについて話していると思います。のnewFixedThreadPool API を参照してくださいExecutors

 public static ExecutorService newFixedThreadPool(int nThreads)

無制限の共有キューで動作する固定数のスレッドを再利用するスレッド プールを作成します。どの時点でも、最大で nThreads スレッドがアクティブな処理タスクになります。すべてのスレッドがアクティブなときに追加のタスクが送信されると、それらのタスクは、スレッドが使用可能になるまでキューで待機します。

シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、必要に応じて後続のタスクを実行するために新しいスレッドが代わりに使用されます。

プール内のスレッドは、明示的にシャットダウンされるまで存在します。

クエリ 2:

スレッドを終了したい場合、スレッドを終了する方法は?

関連するSEの質問を見てください:

ExecutorService の shutdown() は、すべてのスレッドが終了するまで待機しません

于 2016-05-13T12:54:55.617 に答える