私はScheduledExecutorService
定期的にいくつかの異なるタスクをscheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
このスケジューラと一緒に使用している別のものも持っていますRunnable
。問題は、スケジューラからタスクの 1 つを削除しようとするときに発生します。
これを実行する方法はありますか?
異なるタスクに 1 つのスケジューラを使用するのは正しいことでしょうか? これを実装する最適な方法は何ですか?
ベストアンサー1
返された未来を単にキャンセルしますscheduledAtFixedRate()
:
// Create the scheduler
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Create the task to execute
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
// Schedule the task such that it will be executed every second
ScheduledFuture<?> scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
// Wait 5 seconds
Thread.sleep(5000L);
// Cancel the task
scheduledFuture.cancel(false);
もう一つ注意すべき点は、キャンセルしてもタスクがスケジューラから削除されないことです。isDone
メソッドが常に を返すことだけが保証true
されます。このようなタスクを追加し続けると、メモリ リークが発生する可能性があります。たとえば、クライアント アクティビティまたは UI ボタンのクリックに基づいてタスクを開始する場合は、それを n 回繰り返して終了します。そのボタンが何度もクリックされると、スケジューラにまだ参照があるため、ガベージ コレクションできない大きなスレッド プールが作成される可能性があります。
Java 7 以降で使用可能なクラスsetRemoveOnCancelPolicy(true)
を使用することをお勧めします。下位互換性のため、デフォルトは false に設定されています。ScheduledThreadPoolExecutor