Java Academy · Ders

ExecutorService ve İş Parçacığı Havuzu Türleri

Sabit, önbellekli, tek iş parçacıklı ve zamanlanmış iş parçacığı havuzları oluşturun; her birinin ne zaman kullanılacağını anlayın.

1. ders / 413 adım

ExecutorService ve İş Parçacığı Havuzu Türleri, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. 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.

İş Parçacığı Havuzları Neden Kullanılır?

Her görev için yeni bir Thread oluşturmak maliyetlidir; iş parçacığı oluşturma ve yok etme işlemlerinin ek yükü vardır. Bir iş parçacığı havuzu, birçok görevi yürütmek için sabit bir iş parçacığı kümesini yeniden kullanır; böylece ek yükü azaltır ve kaynak tüketimini denetler.

import java.util.concurrent.*;

// Bad practice: new thread per task
new Thread(() -> System.out.println("task")).start();

// Better: reuse threads from a pool
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> System.out.println("task from pool"));
pool.shutdown();

newFixedThreadPool

Tam olarak N iş parçacığı içeren bir havuz oluşturur. Ek görevler, bir iş parçacığı kullanılabilir hâle gelene kadar kuyruğa alınır. İstenen paralellik düzeyini bildiğiniz durumlarda uygundur.

ExecutorService pool = Executors.newFixedThreadPool(4);

for (int i = 0; i < 10; i++) {
    final int taskId = i;
    pool.submit(() -> {
        System.out.println("Task " + taskId + " on " + Thread.currentThread().getName());
    });
}

pool.shutdown();
pool.awaitTermination(10, TimeUnit.SECONDS);

newCachedThreadPool

İş parçacıklarını gerektiğinde oluşturur ve boşta olanları yeniden kullanır. 60 saniye boyunca boşta kalan iş parçacıkları sonlandırılır. Kısa ömürlü çok sayıda görev için uygundur; uzun süre çalışan veya sınırsız görevlerde risklidir (belleği tüketebilir).

ExecutorService cached = Executors.newCachedThreadPool();

for (int i = 0; i < 100; i++) {
    cached.submit(() -> {
        // quick task
        double result = Math.sqrt(Math.random());
    });
}
cached.shutdown();

newSingleThreadExecutor

Tam olarak bir iş parçacığı içeren bir havuzdur. Görevler gönderilme sırasına göre art arda yürütülür. Paylaşılan bir kaynağa erişimi sıralı hâle getirmek için uygundur.

ExecutorService single = Executors.newSingleThreadExecutor();

single.submit(() -> System.out.println("Task 1"));
single.submit(() -> System.out.println("Task 2"));
single.submit(() -> System.out.println("Task 3"));
// Always prints: Task 1, Task 2, Task 3 (sequential)
single.shutdown();

newScheduledThreadPool

Zamanlanmış ve yinelenen görevleri destekler. Yoklama, yeniden denemeler ve arka plan bakımı için kullanınız.

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

// One-shot delay
scheduler.schedule(() -> System.out.println("Delayed!"),
    3, TimeUnit.SECONDS);

// Fixed rate (every 2 seconds)
scheduler.scheduleAtFixedRate(
    () -> System.out.println("Tick"),
    0, 2, TimeUnit.SECONDS);

// Run later: scheduler.shutdown();

VirtualThreadExecutor (Java 21+)

Java 21, oluşturulması kolay ve düşük maliyetli sanal iş parçacıklarını kullanıma sunar. G/Ç ağırlıklı iş yükleri için Executors.newVirtualThreadPerTaskExecutor() kullanınız:

// Java 21+
try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 10_000; i++) {
        final int id = i;
        exec.submit(() -> {
            Thread.sleep(100); // blocks without tying up OS thread
            System.out.println("vthread " + id);
        });
    }
} // auto-shutdown

Doğru Havuzu Seçme

Yönergeler:

  • CPU'ya bağlı görevler: N = CPU çekirdeği sayısı olan sabit havuz
  • G/Ç'ye bağlı görevler: Önbelleğe alınan havuz veya sanal iş parçacıkları
  • Sıralı görevler: Tek iş parçacıklı yürütücü
  • Zamanlanmış/yinelenen görevler: Zamanlanmış iş parçacığı havuzu
int cores = Runtime.getRuntime().availableProcessors();
ExecutorService cpuPool = Executors.newFixedThreadPool(cores);
System.out.println("Pool size: " + cores);

Özel ThreadPoolExecutor

Ayrıntılı denetim için doğrudan bir ThreadPoolExecutor oluşturunuz:

ThreadPoolExecutor tpe = new ThreadPoolExecutor(
    2,           // corePoolSize
    10,          // maximumPoolSize
    60L,         // keepAliveTime
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100), // work queue
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.CallerRunsPolicy() // rejection policy
);
tpe.submit(() -> System.out.println("Custom pool task"));
tpe.shutdown();

Sorunsuz Kapatma

İş parçacıklarını serbest bırakmak için ExecutorService'i her zaman kapatınız. shutdown() yeni görevleri kabul etmeyi durdurur ancak kuyruğa alınmış görevleri tamamlar. shutdownNow() çalışan görevleri iptal etmeyi dener.

ExecutorService pool = Executors.newFixedThreadPool(4);
// ... submit tasks ...

pool.shutdown(); // no new tasks
try {
    if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {
        pool.shutdownNow(); // force cancel
    }
} catch (InterruptedException e) {
    pool.shutdownNow();
    Thread.currentThread().interrupt();
}

AutoCloseable Olarak ExecutorService (Java 19+)

Java 19 ve sonraki sürümlerde ExecutorService, AutoCloseable'ı uygular. Otomatik kapatma için try-with-resources kullanınız:

// Java 19+ (preview), Java 21 stable
try (ExecutorService pool = Executors.newFixedThreadPool(4)) {
    pool.submit(() -> System.out.println("task"));
} // pool.close() called: waits for tasks then shuts down

Reddetme Politikaları

Havuz doygunluğa ulaştığında (tüm iş parçacıkları meşgul ve kuyruk dolu olduğunda), reddetme politikası taşmayı ele alır:

  • AbortPolicy (varsayılan): RejectedExecutionException fırlatır
  • CallerRunsPolicy: çağıran iş parçacığı görevi yürütür
  • DiscardPolicy: görevi sessizce yok sayar
  • DiscardOldestPolicy: kuyruğa alınmış en eski görevi yok sayar

Hızlı Kontrol

Ağır hesaplamalar yapan CPU'ya bağlı bir göreviniz var. Sabit iş parçacığı havuzunuzda kaç iş parçacığı olmalıdır?

Özet: ExecutorService ve İş Parçacığı Havuzları

Temel çıkarımlar:

  • Sabit havuz: sabit sayıda N iş parçacığı; ek görevler kuyruğa alınır
  • Önbelleğe alınan havuz: gerektiğinde büyür; boşta kalan iş parçacıkları 60 saniye sonra sona erer
  • Tek iş parçacığı: sıralı yürütme sırası garanti edilir
  • Zamanlanmış havuz: gecikmeli ve yinelenen görevler
  • Her zaman shutdown(); temiz çıkış için awaitTermination() çağrısını yapınız
Başlamak ücretsiz

Yapay zeka eğitmeniyle Java öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
104
Dersler
374

Sıkça Sorulan Sorular

“ExecutorService ve İş Parçacığı Havuzu Türleri” dersi ücretsiz mi?

Evet — “ExecutorService ve İş Parçacığı Havuzu Türleri” 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.

“ExecutorService ve İş Parçacığı Havuzu Türleri” dersinde ne öğreneceğim?

Sabit, önbellekli, tek iş parçacıklı ve zamanlanmış iş parçacığı havuzları oluşturun; her birinin ne zaman kullanılacağını anlayı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 1. dersidir.

“ExecutorService ve İş Parçacığı Havuzu Türleri” 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