タスクをスケジュールし、特定のイベントが発生したときにそれらを削除する必要があるタスクがあります。私は ScheduledThreadPoolExecutor を使用してタスクをスケジュールしています。これは非常に簡単です。しかし、保留中のアイテムをキャンセルする 2 つの方法を見つけました。どちらも少し奇妙に見えます。
それらのいずれかが製品品質であるかどうかに興味があります。どちらでもない場合、あなたは何を提案しますか?
これが私がしていることのスケルトンです:
private final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
public void doStuff() {
//...
scheduler.schedule(new Runnable() {/*...*/}, 10, TimeUnit.MILISECONDS)
}
public void actOnEvent() {
cancelPendingItems();
doMoreStuff();
}
public void cancelPendnigItems() {
// TODO implement me
}
これは候補 1 です。
public void cancelPendingItems() {
scheduler.getQueue().clear();
}
これは候補 2 です。
public void cancelPendingItems() {
for (Runnable task : scheduler.getQueue()) {
scheduler.remove(task);
}
}
どちらも、ScheduledExecutor インターフェイスで指定されていない ScheduledThreadPoolExecutor.queue プロパティに依存しているため、私にはハックのように見えます。ScheduledThreadPoolExecutor の不変式に違反する可能性があり、それを検出するのが遅すぎるのではないかと少し心配しています。
では、これらのスニペットは、私が望んでいることを実行するでしょうか? それを行うためのより良い/よりクリーンな方法はありますか?