Ho un compito che mi richiede di pianificare le attività e rimuoverle quando si verifica un determinato evento. Sto usando un ScheduledThreadPoolExecutor per pianificare le attività, è piuttosto semplice. Ma ho trovato due modi per cancellare gli elementi in sospeso, entrambi sembrano un po 'strani.Come cancellare gli elementi in sospeso da ScheduledThreadPoolExecutor?
Sono curioso di sapere se qualcuno di questi è di qualità di produzione. Se nessuno di loro, allora cosa suggerisci?
Ecco uno scheletro di quello che faccio:
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
}
Questo è candidata 1:
public void cancelPendingItems() {
scheduler.getQueue().clear();
}
Questo è candidato 2:
public void cancelPendingItems() {
for (Runnable task : scheduler.getQueue()) {
scheduler.remove(task);
}
}
Entrambi sembrano un trucco per me perché dipendono dalla proprietà ScheduledThreadPoolExecutor.queue che non è specificata nell'interfaccia di ScheduledExecutor . Sono un po 'preoccupato che potrei violare un invariante di ScheduledThreadPoolExecutor e lo rileverò troppo tardi.
Quindi, questi snippet faranno ciò che voglio che facciano? Ci sono modi migliori/più puliti per farlo?
Grazie! Fortunatamente, si adatta al mio problema reale perché non ci sono troppe attività possibili, quindi questa pulizia sarà ragionevolmente veloce. Quale è importante per la nostra applicazione con risorse limitate. –