0Pricing
Java Academy · Ders

Yinelenen Görevler için ScheduledExecutorService

Yoklama ve arka plan bakımı işleri için görevleri sabit hızlarda veya sabit gecikmelerle zamanlayın.

Yinelenen Görevler için ScheduledExecutorService, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

ScheduledExecutorService Neden Kullanılır?

ScheduledExecutorService, görev zamanlamasını desteklemek için ExecutorService'i genişletir. Eski Timer/TimerTask sınıflarının yerini, iş parçacığı havuzuyla desteklenen ve istisnalara karşı güvenli bir zamanlayıcı olarak alır.

import java.util.concurrent.*;

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

// One-shot delay
scheduler.schedule(
    () -> System.out.println("Runs once after 3 seconds"),
    3, TimeUnit.SECONDS
);

// Don't forget to shut down eventually:
// scheduler.shutdown();

schedule: Tek Seferlik Gecikme

schedule(task, delay, unit), belirtilen gecikmeden sonra görevi bir kez çalıştırır. Hem Runnable hem de Çağrılabilir ile çalışır:

ScheduledExecutorService s = Executors.newScheduledThreadPool(1);

// Runnable:
ScheduledFuture<?> sf1 = s.schedule(
    () -> System.out.println("Runnable fired!"), 2, TimeUnit.SECONDS);

// Callable:
ScheduledFuture<Integer> sf2 = s.schedule(
    () -> { System.out.println("Callable fired!"); return 42; },
    2, TimeUnit.SECONDS);

System.out.println(sf2.get()); // 42 (after 2 seconds)

scheduleAtFixedRate

scheduleAtFixedRate(task, initialDelay, period, unit), görevi sabit bir hızda yineli biçimde çalıştırır. Bir görev dönemden uzun sürerse sonraki yürütme, görev tamamlanır tamamlanmaz başlar (çakışma olmaz).

ScheduledExecutorService s = Executors.newScheduledThreadPool(1);
AtomicInteger count = new AtomicInteger();

ScheduledFuture<?> sf = s.scheduleAtFixedRate(
    () -> System.out.println("Tick " + count.incrementAndGet()),
    0,   // initial delay
    1,   // period
    TimeUnit.SECONDS
);

Thread.sleep(5000);
sf.cancel(false); // stop after 5 ticks
s.shutdown();

scheduleWithFixedDelay

scheduleWithFixedDelay(task, initialDelay, delay, unit), sonraki görevi başlatmadan önce her görev tamamlandıktan SONRA belirtilen süre kadar bekler. Görev süresinin değiştiği yoklama işlemleri için uygundur.

s.scheduleWithFixedDelay(
    () -> {
        System.out.println("Polling... " + Instant.now());
        // variable-length polling task
    },
    0,  // no initial delay
    5,  // 5-second gap AFTER each completion
    TimeUnit.SECONDS
);
// Next execution = task end + 5 seconds (not task start)

Sabit Hız ile Sabit Gecikme Karşılaştırması

Temel ayrım:

  • scheduleAtFixedRate: sonraki başlangıç = son başlangıç + dönem (kaymasız zamanlama)
  • scheduleWithFixedDelay: sonraki başlangıç = son tamamlanma + gecikme (yürütmeler arasında garantili boşluk)

Nabız sinyalleri için fixedRate, görev süresinin değiştiği yoklama işlemleri için fixedDelay kullanınız.

ScheduledFuture: İptal Etme

schedule/scheduleAtFixedRate/scheduleWithFixedDelay bir ScheduledFuture döndürür. Çalışan görevi kesmeden sonraki yürütmeleri durdurmak için cancel(false) çağrısını yapınız:

ScheduledFuture<?> sf = scheduler.scheduleAtFixedRate(
    () -> System.out.println("Heartbeat"), 0, 1, TimeUnit.SECONDS);

// Cancel after 5 seconds
scheduler.schedule(() -> sf.cancel(false), 5, TimeUnit.SECONDS);

Zamanlanmış Görevlerde İstisna İşleme

Zamanlanmış bir görev yakalanmamış bir istisna fırlatırsa, zamanlayıcı yinelenen yürütmeleri sessizce durdurur; başka yürütme gerçekleşmez. Her zaman try-catch içine alınız:

scheduler.scheduleAtFixedRate(() -> {
    try {
        // risky work
        if (Math.random() < 0.3) throw new RuntimeException("transient");
        System.out.println("Success");
    } catch (Exception e) {
        System.err.println("Task error: " + e.getMessage());
        // task continues to run on next interval
    }
}, 0, 2, TimeUnit.SECONDS);

Pratik: Önbelleği Yenileme

Bir önbelleği düzenli aralıklarla yenilemek için zamanlanmış bir görev kullanınız:

class PriceCache {
    private volatile Map<String, Double> prices = new HashMap<>();
    
    PriceCache(ScheduledExecutorService scheduler) {
        scheduler.scheduleAtFixedRate(this::refresh, 0, 30, TimeUnit.SECONDS);
    }
    
    private void refresh() {
        System.out.println("Refreshing prices...");
        // prices = fetchFromDatabase();
    }
    
    Double getPrice(String symbol) { return prices.get(symbol); }
}

Pratik: Geri Çekilmeli Yeniden Deneme

Zamanlanmış görevleri kullanarak üstel geri çekilmeli yeniden denemeyi uygulayın:

void retryWithBackoff(Runnable task, int maxRetries, ScheduledExecutorService s) {
    AtomicInteger attempts = new AtomicInteger(0);
    long[] delay = {1}; // seconds
    
    Runnable wrapper = new Runnable() {
        public void run() {
            try {
                task.run();
            } catch (Exception e) {
                int n = attempts.incrementAndGet();
                if (n < maxRetries) {
                    delay[0] *= 2;
                    s.schedule(this, delay[0], TimeUnit.SECONDS);
                } else System.err.println("Max retries reached");
            }
        }
    };
    s.execute(wrapper);
}

İzleme: getDelay ve getQueue

Zamanlayıcının durumunu inceleyin:

ScheduledFuture<?> sf = scheduler.schedule(() -> {}, 10, TimeUnit.SECONDS);
System.out.println("Delay remaining: " + sf.getDelay(TimeUnit.SECONDS) + "s");

// ThreadPoolExecutor provides queue inspection:
if (scheduler instanceof ScheduledThreadPoolExecutor ste) {
    System.out.println("Queue size: " + ste.getQueue().size());
}

Kapatma ve Kuyruğu Boşaltma

Kapatma sırasında, zamanlanmış görevlerin çalışmaya devam edip etmeyeceğine karar verin:

ScheduledThreadPoolExecutor ste = (ScheduledThreadPoolExecutor)
    Executors.newScheduledThreadPool(2);

// Cancel scheduled tasks on shutdown (default: false = they run)
ste.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
ste.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);

ste.shutdown();

Hızlı Kontrol

scheduleAtFixedRate(..., 1, TimeUnit.SECONDS) ile zamanlanan bir görevin tamamlanması 3 saniye sürüyor. Zamanlayıcı bunu nasıl ele alır?

Özet: ScheduledExecutorService

Temel çıkarımlar:

  • schedule() — gecikmeli, tek seferlik çalıştırma
  • scheduleAtFixedRate() — kaymasız zamanlama (başlangıçtan başlangıca)
  • scheduleWithFixedDelay() — garanti edilen aralık (tamamlanmadan sonraki başlangıca)
  • Yakalanmayan istisnalar yinelenen görevleri sessizce durdurur — her zaman try-catch içine alın
  • ScheduledFuture.cancel(false) ile iptal edin

Sıkça Sorulan Sorular

“Yinelenen Görevler için ScheduledExecutorService” dersi ücretsiz mi?

Evet — “Yinelenen Görevler için ScheduledExecutorService” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Yinelenen Görevler için ScheduledExecutorService” dersinde ne öğreneceğim?

Yoklama ve arka plan bakımı işleri için görevleri sabit hızlarda veya sabit gecikmelerle zamanlayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Yinelenen Görevler için ScheduledExecutorService” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ExecutorService ve İş Parçacığı Havuzu Türleri
  2. Görev Gönderme: Runnable ve Callable
  3. Future ve Hata İşleme
  4. Yinelenen Görevler için ScheduledExecutorService
← Java Academy Sayfasına Dön