Giriş
Şu satırı dahil ederiz.
Ş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()
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.
schedule metodu - Runnable
Şöyle yaparız.
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(SCHEDULER_COUNT, new ThreadPoolTaskScheduler());
1. Single Shot Timer Metodlar
schedule metodu - Callable
ScheduledExecutorService Arayüzü Single Shot Timer Metodları yazısına taşıdım.
ScheduledExecutorService Arayüzü Single Shot Timer Metodları yazısına taşıdım.
submit metodu - Runnable
ScheduledExecutorService Arayüzü Single Shot Timer Metodları yazısına taşıdım.
ScheduledExecutorService Arayüzü Single Shot Timer Metodları yazısına taşıdım.
2. Periodic Timer Metodlar
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.
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.
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ı.
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.Yani Thread.sleep() hiçbir zaman tam olarak 1 saniye beklemez.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
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