2012-03-29 12 views
10

私はScheduledExecutorServiceを私のアプリケーションに使用しています。スケジュールされたスレッドを実行するには、特定のユーティリティクラスで時々使用する必要があります。ScheduledExecutorService:シャットダウンを呼び出す必要がある場合

固定フィールドでScheduledExecutorServiceを保持するのがよい設計ですか?このような場合にScheduledExecutorService.shutdown()を呼び出す必要がありますか?シャットダウンを起動しないと、どのようなリスクがありますか?私がやって考えたものだ

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5); 

public void scheduleTask(String name) { 
     Future<?> future = futuresMapping.get(name); 
     if(future!=null && !future.isDone()) 
      future.cancel(true); 

     //execute once 
     Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES); 
     futuresMapping.put(name, f); 
} 

ありがとう

答えて

5

必ずshutdown()またはshutdownNow()を呼び出す必要があります。そうしないと、アプリケーションが終了している(アプリケーションを終了する方法、管理された環境にあるかどうかなどによって)まだスレッドがアクティブであるため、アプリケーションが終了することはありません。

通常、SpringのDisposableBean.destroy()などのライフサイクルイベントメソッドからshutdown()を呼び出すか、フレームワークを使用していない場合は、アプリケーションから終了する前に呼び出すだけです。

+0

私はscheduledExecutor.shutdownNow()を追加しようとしました。 Webアプリケーション[/ servlet]が[Timer-0]という名前のスレッドを開始したように見えますが、停止に失敗しました。これはメモリリークを引き起こす可能性が非常に高いです。 "どうすればこのエラーを回避できますか?助けてくれてありがとう – lili

+0

shutdownNow()はすぐに戻るブロッキングコールです。スレッドプールが実際に停止するまでブロックするawaitTermination()を呼び出してください。 – maximdim

+0

私は試しましたが、うまくいきませんでした。私は30秒以上待つべきですか?私はhttp://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnowで詳細を書いた ありがとう – lili

3

効果的なJavaの第2版は言う:

そして、ここではあなたの場合(正常に終了するようexecutorを伝える方法ですこれをしないと、 はあなたのVMが終了しない可能性が高いです):

executor.shutdown();

関連する問題