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.
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-shutdownDoğ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 downReddetme 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):
RejectedExecutionExceptionfı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
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
- ExecutorService ve İş Parçacığı Havuzu Türleri
- Görev Gönderme: Runnable ve Callable
- Future ve Hata İşleme
- Yinelenen Görevler için ScheduledExecutorService