2013-02-20 12 views
18

executorオブジェクトは、shutdownの後で再利用することを意図していますか?私は、executorが終了した後に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(); 
    } 
} 

は動作しません。 stopを呼び出して startを呼び出すと、条件によって新しいスレッドプールが作成されません。これをコード化する適切な方法は何ですか?

+1

「... &&!threadPool.isShutdown() 'を実行すると、TPがまだ実行中(つまり_started_)の場合にのみ早く戻ります。 –

+0

@RalfH:良い点!OP – Jim

+0

が正常に更新され、同じスレッドから 'stop'、' start'が呼び出されましたか? –

答えて

16

the docから:

終了した場合、ノー、(簡単に)実行者は、積極的に何 タスクが実行を待っていない、何のタスクを実行していない、と新しいタスクがそう

を提出することはできません、それを再利用することはできません。 the shutdown() doc

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

方法isTerminated()isShutdown()はexecutorでshutdownが実行されたかどうかを決定するために使用することができ、そしてタスクがそれぞれ完了していること。

+0

更新 – Jim

5

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

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

注:あなたはそれを再利用する場合ではないシャットダウンThreadPoolExecutorを行います。あなたが再作成する必要があるかどうかを知りたい場合は、このexecutorが

+0

を参照してください更新 – Jim

+0

を参照してください。私の回答も更新しました –

+0

本質的に 'stop'で' threadPool = null'を実行する必要がありますか? – Jim

5

我々はOracla Javas ThreadPoolExecutorについて話しているがシャットダウンされている場合は、あなたのThreadPoolEdxecutorが真

ExecutorService.isShutdown() 

戻り値を使用し

2)(エグゼキュータを実装インターフェイス)ここに。そこには、シャットダウンのメソッドコメントは明示的に遷移を禁止していませんシャットダウン に戻るが、クラスコメントにはThreadPoolExecutorsでサポートされているすべての遷移がリストされ、シャットダウンから戻ることはありません。戻ってくる別の方法が必要または同様の再起動/開始。これは存在しませんが、有用であると知った人は、シャットダウンのセマンティクスを破ることなく、インターフェイスを拡張し、シャットダウン後に再起動することができます。シャットダウン自体は最終的に処理が停止することを保証するものではないため、おそらく少し難しいでしょう。それで、労働者は彼らが終わったら、彼らが終わるまで続けるかもしれません。このような状況で再起動を可能にすることは、別のエグゼキュータを作成するだけの場合と比べて余計な作業にはならないでしょう。

関連する問題