ScheduledExecutorService からタスクを削除するにはどうすればいいですか? 質問する

ScheduledExecutorService からタスクを削除するにはどうすればいいですか? 質問する

私は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

おすすめ記事