22

エグゼキュータ オブジェクトは、の後に再利用されることを意図していshutdownますか? つまり、エグゼキューターを呼び出した場合、shutdownまたはshutdownNow終了した後、new新しいスレッドプールを作成する必要がありますか、または以前に終了したエグゼキューターを何らかの方法で「リセット」/再利用して再利用することは可能ですか?

更新:
新しいスレッド プールを作成する必要がある場合、以前のスレッド プールが停止されたことをどのように「理解」できますか?
例:

public void startPool(){  
   if(threadPool != null && !threadPool.isShutdown()){
    return;
   }  
   threadPool = Executors.newCachedThreadPool();  
   //other stuff

}  

public void stopPool(){  
   if(threadPool != null){  
    threadPool.shutdown();   
  }  
}   

動作しないでしょう。呼び出した場合stopstart条件により新しいスレッド プールが作成されません。これをコーディングする適切な方法は何ですか?

4

3 に答える 3

21

ドキュメントから:

終了すると、エグゼキューターにはアクティブに実行されているタスクがなく、実行を待っているタスクもなく、新しいタスクを送信することもできません

だから(簡単に)いいえ、再利用することはできません。shutdown() docから:

以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。

メソッドisTerminated()とメソッドをisShutdown()使用して、executor がシャットダウンされたかどうか、およびタスクがそれぞれ完了したかどうかを判断できます。

于 2013-02-20T10:38:20.190 に答える
6

ここでは、Oracla Javas ThreadPoolExecutor(Executorインターフェースの実装)について話します。そこで、shutdownに関するメソッドコメントは、 ShutdownからRunningへの遷移を明示的に禁止していませんが、クラスコメントには、ThreadPoolExecutorsでサポートされているすべての遷移がリストされており、Shutdownから戻る方法はありません。戻るには、別のメソッドの再起動/開始が必要になりますまたは類似。これは存在しませんが、便利だと思った人は、シャットダウンのセマンティクスを壊すことなく、インターフェイスを拡張し、シャットダウン後に再起動を実装できます。シャットダウン自体は処理が最終的に停止することを保証しないため、そうすることはおそらく少し難しいでしょう。ですから、もし彼らが終わったとしても、労働者は彼らが終わるまで続けるかもしれません。このような状況で再起動を可能にすることは、別のエグゼキュータを作成するだけの場合と比較して、追加の作業の価値がない可能性があります。

于 2013-02-20T10:51:05.993 に答える
6

1) ThreadPoolExecutor をシャットダウンした後、API を再利用することはできません。

An ExecutorService can be shut down, which will cause it to reject new tasks

注: 再利用する場合は、ThreadPoolExecutor をシャットダウンしないでください。

2) ThreadPoolEdxecutor の使用を再作成する必要があるかどうかを知りたい場合

ExecutorService.isShutdown()

このエグゼキュータがシャットダウンされている場合は true を返します

于 2013-02-20T10:46:33.730 に答える