25 Mart 2021 Perşembe

ScheduledThreadPoolExecutor ve İşin İptali

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);
Örnek
Elimizde şö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 job
    ScheduledFuture<?> scheduledFuture = executor.scheduleWithFixedDelay(() -> {
      this.evictExpired();
      }, 20, 20, TimeUnit.SECONDS);
    }
   
    // Evict all expired messages from the cache
    public void evictExpired() {
      ...
    }

    // Purge entire cache and free resources
    public void purge() {
      ...
      scheduledFuture.cancel(false);
  }
}

Hiç yorum yok:

Yorum Gönder