25 Mart 2021 Perşembe

ScheduledExecutorService Arayüzü Periodic Timer Metodları

Giriş
İki tane metod var. Bunlar
scheduleWithFixedDelay() - İş bitmese bile yeni timer başlar
scheduleAtFixedRate() - İş bitince yeni timer başlar.
Farklılığın açıklaması şöyle
The scheduleAtFixedRate() method creates a new task and submits it to the executor every period, regardless of whether or not the previous task finished.

On the other hand, the scheduleWithFixedDelay() method creates a new task after the previous task has finished.
Yani scheduleWithFixedRate() yeni işi tam saatinde başlatır. Her saat başı kahve yapan işin çıktısı şöyle.  İş 10 dakika sürüyor. Bir sonraki iş ileri kaymadı
00:00: Start making coffee
00:10: Finish making coffee
01:00: Start making coffee
01:10: Finish making coffee
02:00: Start making coffee
02:10: Finish making coffee
Yani scheduleWithFixedDelay() yeni işi bir önceki işe göre başlatır. Çıktısı şöyle. İş 10 dakika sürüyor. Bir sonraki iş te 10 dakika ileri kaydı.
00:00: Start making coffee
00:10: Finish making coffee
01:10: Start making coffee
01:20: Finish making coffee
02:20: Start making coffee
02:30: Finish making coffee



scheduleWithFixedDelay metodu - Runnable
İmzası şöyle.
@Override
public ScheduledFuture< ? > scheduleWithFixedDelay(final Runnable command,
  final long initialDelay,final long delay,final TimeUnit unit);
Bu metod bir sonraki timer zamanını Runnable bittikten sonra kurar.
Örnek
Şöyle yaparız.
scheduledExecutorService.scheduleWithFixedDelay (foo, 1, 1, TimeUnit.NANOSECONDS);

scheduleAtFixedRate metodu - Runnable
İmzası şöyle.
@Override
public ScheduledFuture< ? > scheduleAtFixedRate(final Runnable command,
  final long initialDelay, final long period,final TimeUnit unit);
İlk parametre Runnable arayüzünden kalıtan bir nesnedir.
İkinci parametre delay yani gecikmedir.
Üçüncü parametre süredir 
Dördüncü parametre ise sürenin birimini belirtir.

Örnek
Mesela her dakika bir çalışması istenen iş şöyle yaratılır.
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleAtFixedRate(myRunnable , 0, 1, TimeUnit.MINUTES);
Örnek
Her saniye bir çalışması istenen iş şöyle yaratılır.
es.scheduleAtFixedRate(myRunnable, 0, 1, TimeUnit.SECONDS);
Örnek
Milisaniye seviyesinde çalışması istenen iş şöyle yaratılır.
es.scheduleAtFixedRate(myRunnable, 0L, 500, TimeUnit.MILLISECONDS);


Hiç yorum yok:

Yorum Gönder