Giriş
Açıklaması şöyle. Dolayısıyla işi iptal edecekseki kuyruktan silinmesi için setRemoveOnCancelPolicy(true) şeklinde çağırmak gerekir.
ScheduledThreadPoolExecutor maintains an internal work queue of submitted tasks. If a task is cancelled, it does not remove the task from the queue. So it maintains the reference to task.
Örnek
Şöyle yaparız. Böylece future nesnesi ile bu işi durdurmak mümkün olur.
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.setRemoveOnCancelPolicy(true);
ScheduledFuture<?> future = executor.scheduleAtFixedRate(() -> {
...
}, 1, 2, TimeUnit.SECONDS);
ÖrnekElimizde şöyle bir kod olsun. Bu kod hatalı, çünkü ScheduledFuture nesnesinin cancel() metodu çağrılsa bile aslında ScheduledExecutorService nesnesnin kuyruğundan silinmiyor.
public class UserMessageCache {ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);ScheduledFuture<?> scheduledFuture;public UserMessageCache() {// Setup a cleaning jobScheduledFuture<?> scheduledFuture = executor.scheduleWithFixedDelay(() -> {this.evictExpired();}, 20, 20, TimeUnit.SECONDS);}// Evict all expired messages from the cachepublic void evictExpired() {...}// Purge entire cache and free resourcespublic void purge() {...scheduledFuture.cancel(false);}}
Hiç yorum yok:
Yorum Gönder