16 Ekim 2018 Salı

ScheduledExecutorService Arayüzü

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.ScheduledExecutorService;
Şeklen şöyle. Sınıfın içinde bir tane DelayQueue nesnesi bulunur. Worker thread'ler bu kuyruktan iş çekmeye çalışır


constructor - Executors.newSingleThreadScheduledExecutor()
Java 8' ile şöyleydi. Döndürülen nesne DelegatingScheduledExecutorService sınıfı tipinden.
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
  return new DelegatedScheduledExecutorService
    (new ScheduledThreadPoolExecutor(1));
}
constructor - Executors.newSingleThreadScheduledExecutor(ThreadFactory)
Açıklama yaz

constructor - Executors.newScheduledThreadPool(corePoolSize)
corePoolSize için açıklama şöyle. Sürekli yaşayan sabit thread sayısı anlamına gelir.
In case of ScheduledThreadPoolExecutor, corePoolSize is maximum number of threads that will be created to perform scheduled actions. This thread pool is fixed-sized and idle threads are kept alive.
Örnek - Yanlış
Şu kod hatalı. Eski JDK sürümlerinde 0 corePoolSize %100 işlemci kullanımına sebep oluyor
ScheduledExecutorService service = Executors.newScheduledThreadPool(0);
Örnek
Şöyle yaparız.
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
constructor - Executors.newScheduledThreadPool(corePoolSize,ThreadFactory)
Örnek
Şöyle yaparız.
ScheduledExecutorService scheduledExecutorService = 
  Executors.newScheduledThreadPool(SCHEDULER_COUNT, new ThreadPoolTaskScheduler());
1. Single Shot Timer Metodlar

schedule metodu - Callable

schedule metodu - Runnable

submit metodu - Runnable

submit metodu - Runnable + Result
ScheduledExecutorService Arayüzü Single Shot Timer Metodları yazısına taşıdım.

2. Periodic Timer Metodlar

scheduleAtFixedRate metodu - Runnable
ScheduledExecutorService Arayüzü Periodic Timer Metodları yazısına taşıdım.

scheduleWithFixedDelay metodu - Runnable
ScheduledExecutorService Arayüzü Periodic Timer Metodları yazısına taşıdım.

Diğer
Bu sınıfa alternatif olarak Timer Sınıfı kullanılabilir. Bu sınıf System.nanoTime() metodunu kullandığı için sistem saatindeki değişmelerden etkilenmez.

Bu Executor periyodik işler için kullanılır. Bu Executor altta DelayedWorkQueue kullanıyor. Bu sınıf Thread.Sleep'in döngü içinde kullanılmasından daha iyi.
for(int i =0; i<10; i++)
{
  long t1 = System.nanoTime();
  try{
    Thread.sleep(1000);
  }
  catch(Exception e){...}
    double time = (System.nanoTime() - t1)/1000000;
    System.out.println(i+") "+time);
}
Çıktı olarak şunu alırız.
0) 987.0
1) 999.0
2) 999.0
3) 999.0
4) 999.0
5) 1000.0
6) 999.0
7) 997.0
8) 999.0
9) 999.0
Yani Thread.sleep() hiçbir zaman tam olarak 1 saniye beklemez.

Sınıfın her zaman shutdown() metodunun çağrılması gerekir. Şu kod yanlış. Çünkü main metodu kod hiçbir zaman sonlanmıyor. Sanırım bunun sebebi sınıfın non-daemon thread kullanması.
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

class Main {
  public static void main(String[] args) {
    ScheduledExecutorService ex = Executors.newScheduledThreadPool(100);
    ex.submit(() -> { System.out.println("."); });
  }
}


Hiç yorum yok:

Yorum Gönder