11 Eylül 2019 Çarşamba

ScheduledThreadPoolExecutor Sınıfı

Giriş
Açıklaması şöyle.
ThreadPoolExecutor that can additionally schedule commands to run after a given delay, or to execute periodically. This class is preferable to Timer when multiple worker threads are needed, or when the additional flexibility or capabilities of ThreadPoolExecutor (which this class extends) are required.
ScheduledThreadPoolExecutor sınıfı ThreadPoolExecutor sınıfından kalıtır. Bir işin belirtilen zamanda çalışmasını sağlar. Bu sınıfı kullanıcı tarafından verilen işi ScheduledFutureTask ile sarmalar ve kuyruğa ekler.


Bu sınıf ile ScheduledExecutorService aynı arayüzü sağlarlar.

Kuyruk DelayQueue olarak gerçekleştirilir , yani ilk çalışacak işlere göre sıralanmıştır.

constructor
Şöyle yaparız.
ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(1);
Şöyle yaparız.
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
afterExecute metodu
Şöyle yaparız.
s = new ScheduledThreadPoolExecutor(...) {
  @Override
  public void afterExecute(Runnable r, Throwable t) {
    super.afterExecute(r, t);
    ...
  }
};
scheduleAtFixedRate metodu - Runnable + initialDelay + period + timeUnit
ScheduledFuture<?> nesnesi döner.

Örnek
Şöyle yaparız.
s.scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {
  ...
  }
}, 0, 10, TimeUnit.SECONDS);
Ö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);
shutdown metodu
Şöyle yaparız.
//Cancel scheduled but not started task, and avoid new ones
myScheduler.shutdown();

//Wait for the running tasks 
myScheduler.awaitTermination(30, TimeUnit.SECONDS);

//Interrupt the threads and shutdown the scheduler
myScheduler.shutdownNow();
setRemoveOnCancelPolicy metodu

setRejectedExecutionHandler metodu
Şöyle yaparız.
s.setRejectedExecutionHandler(rejectedHandler);
Diğer

java.util.Timer ile Mukayese
java.util.Timer tek bir thread tarafından çalıştırılır. Eğer bir timer uzun sürerse diğer işlerin zamanının kaymasına sebep olabilir. Bu yüzden birden fazla thread kullanan ScheduledThreadPoolExecutor sınıfı hassas zamanlama işlerinde tercih edilmelidir.

Hiç yorum yok:

Yorum Gönder