2017-07-12 4 views
0

この問題は、「process()」メソッドが10個のスレッドを完了するまでにかなりの時間がかかるため、tt.shutdownService()が直ちに実行されたことになります。 shutdownService()が他のスレッドの後、つまりprocess()の実行後に確実に実行されるようにする方法は?他のスレッドで他のアクティビティの後にExecutorServiceオブジェクトをシャットダウンする方法はありますか?

public class ThreadTest{ 

    private ExecturoService service; 

    void main(String[] args){ 
     long startTime = System.currentTimeLillis(); 

     ThreadTest tt = new ThreadTest(); 
     tt.process(); 

     tt.shutdownService(); 

     long endTime = System.currentTimeLillis(); 
    } 

    public ThreadTest(){ 
     service = Executors.newFixedThreadPool(10); 
    } 
    public void process(){ 
     ... 
     service.execute(new Runnable){...} 
    } 

    public void shutdownService(){ 
     if(service != null){ 
      service.shutdown(); 
      service.awaitTermination(60, TimeUnit.SECONDS); 
     } 
    } 
} 

私の実際のプログラムはもう少し複雑です。 process()はループ内で複数回呼び出されるため、process()でサービスをシャットダウンできません。ここで私はケースを単純化した。

答えて

0

Javadocs

を1として、この方法では、実行を完了するために、以前に提出したタスクを待ちません。これを行うにはawaitTerminationを使用します。

+0

さらにご覧ください。 – user697911

+0

@ user697911あなたの追加は、すべてのタスクが完了するまでではなく、60秒間だけ待機します。 – Tavo

0

あなたが探しているものはawaitTerminationです。このコードは、すべてのタスクが終了するまで実際に待機します。または、時間の終わりまで、何が起こっても、最初に起こります。

executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS); 
+0

この場合、service.shutdown()文は必要ありません。 – user697911

+0

'Executor'が新しいタスクを受け入れることを望まないなら、あなたは行います。これが 'service.shutdown()'の機能です。 – Tavo

+0

二重引用符で受け入れられた回答を参照 –

関連する問題