Başka bir görev havuzu türü de zamanlanmış görev havuzudur. İsme bakılırsa, bu türü belirli bir görevin ne zaman başlatılması gerektiğini planlamak için kullandığımızı varsayabiliriz.

Bu tür bir hizmet, belirli bir süre geçtikten sonra bir etkinliği başlatma görevimiz olduğunda veya yinelenen bir görev planlamak istediğimizde kullanışlıdır.

Birini kullanmak için Executors.newScheduledThreadPool(1) diyoruz .

Parametreler hakkında biraz sonra konuşacağız. Ancak şimdilik bilmemiz gereken, bu metot çağrıldığında bir ScheduledExecutorService nesnesi elde ettiğimizdir.

ScheduledExecutorService , ExecutorService öğesini genişleten bir arabirimdir.

Bu arayüzde aşağıdaki yöntemler görünür:

Yöntem Açıklama

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
Belirtilen gecikmeden sonra çalışan tek seferlik bir eylem oluşturur ve yürütür.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
oluşturur ve yürütürPlanlanmış Gelecekbelirli bir gecikmeden sonra yürütülen nesne.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
Önce belirtilen ilk gecikmeden sonra ve ardından belirtilen süreden sonra tekrar çalışan yinelenen bir eylem oluşturur ve yürütür. Diğer bir deyişle, çalıştırma, InitialDelay , ardından InitialDelay + period , ardından InitialDelay + 2 * period vb. sonrasında başlayacaktır .

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
İlk olarak belirtilen ilk gecikmeden sonra ve ardından bir yürütmenin tamamlanması ile bir sonrakinin başlaması arasında belirtilen gecikmeyle yeniden yürütülen yinelenen bir eylem oluşturur ve yürütür.

Böylece arayüz, görevleri düzenli aralıklarla veya biraz gecikmeden sonra çalıştırmamıza izin verir.

newScheduledThreadPool yöntemi hakkında daha fazla bilgi.

Bunu birkaç şekilde arayabiliriz:


newScheduledThreadPool(int corePoolSize)
corePoolSize , boşta olsalar bile havuzda tutulacak iş parçacığı sayısıdır.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize , boşta olsalar bile havuzda tutulacak iş parçacığı sayısıdır.

threadFactory , yeni iş parçacıkları oluştururken kullanılacak fabrikadır.

Her iki yöntem de belirli bir gecikmeden sonra veya periyodik olarak yürütülecek eylemleri planlayabilen bir iş parçacığı havuzu oluşturacaktır.

ScheduledThreadPool'un nasıl çalıştığını görmek için bir örneğe bakalım .

Örneğin, her 5 saniyede bir e-postayı kontrol etme görevimiz olduğunu varsayalım, ancak bu kontrol ana programı etkilememeli ve ek kaynakların potansiyel tüketimini gerektirmemelidir.

E-postayı kontrol etmeyi simüle eden bir görev sınıfımız var.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

Ardından, bir iş parçacığı havuzu oluşturup kontrolü planlıyoruz.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

Çıktıda, her 5 saniyede bir şunu görüyoruz:

E-posta kontrol ediliyor...

Genel olarak, örnekteki gibi periyodik "temizlik" görevlerini gerçekleştirmek için böyle bir havuzu kullanabiliriz. Temizlik görevleri, ana programın ne yaptığından bağımsız olarak gerçekleştirilmesi gereken görevlerdir.