私は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);
}
ありがとう
私はscheduledExecutor.shutdownNow()を追加しようとしました。 Webアプリケーション[/ servlet]が[Timer-0]という名前のスレッドを開始したように見えますが、停止に失敗しました。これはメモリリークを引き起こす可能性が非常に高いです。 "どうすればこのエラーを回避できますか?助けてくれてありがとう – lili
shutdownNow()はすぐに戻るブロッキングコールです。スレッドプールが実際に停止するまでブロックするawaitTermination()を呼び出してください。 – maximdim
私は試しましたが、うまくいきませんでした。私は30秒以上待つべきですか?私はhttp://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnowで詳細を書いた ありがとう – lili