Thread Pool Boyutu Kaç Olmalı: ExecutorService Ayarlama

Thread pool boyutu yanlış ayarlanırsa uygulamanız ya kaynak israfı yapar ya da performans düşer. ExecutorService ile doğru boyutu seçmek sistem tipine bağlıdır.

İki ana senaryo vardır:

CPU-yoğun görevler için: Thread sayısı = CPU çekirdek sayısı. Örneğin 4 çekirdekli sistemde 4 thread yeterlidir. Daha fazla thread bağlam değiştirme maliyeti artırır.

I/O-yoğun görevler için: Thread sayısı = CPU çekirdek sayısı × (1 + bekleme oranı). Ağ veya veritabanı işlemleri sırasında thread beklerken diğerleri çalışabilir. Tipik değer 10-20 thread arası.

Önce sistem çekirdek sayısını alın:

1int coreCount = Runtime.getRuntime().availableProcessors();
2System.out.println("Çekirdek sayısı: " + coreCount);

Çıktı örneği:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Çekirdek sayısı: 8

CPU-yoğun iş için ExecutorService oluşturun:

1import java.util.concurrent.*;
2
3public class ThreadPoolExample {
4public static void main(String[] args) {
5int poolSize = Runtime.getRuntime().availableProcessors();
6ExecutorService executor = Executors.newFixedThreadPool(poolSize);
7
8// 10 görev gönder
9for (int i = 1; i <= 10; i++) {
10final int taskId = i;
11executor.submit(() -> {
12System.out.println("Görev " + taskId + " çalışıyor: " +
13Thread.currentThread().getName());
14// CPU-yoğun işlem simülasyonu
15long sum = 0;
16for (long j = 0; j < 100_000_000; j++) {
17sum += j;
18}
19});
20}
21
22executor.shutdown();
23try {
24executor.awaitTermination(10, TimeUnit.SECONDS);
25} catch (InterruptedException e) {
26Thread.currentThread().interrupt();
27}
28System.out.println("Tüm görevler tamamlandı.");
29}
30}

Çıktı:

1Görev 1 çalışıyor: pool-1-thread-1
2Görev 2 çalışıyor: pool-1-thread-2
3Görev 3 çalışıyor: pool-1-thread-3
4Görev 4 çalışıyor: pool-1-thread-4
5Görev 5 çalışıyor: pool-1-thread-1...
6Tüm görevler tamamlandı.

I/O-yoğun iş için daha fazla thread kullanın:

1int ioPoolSize = coreCount * 2 + 1; // Örnek: 8 çekirdek 17 thread
2ExecutorService ioExecutor = Executors.newFixedThreadPool(ioPoolSize);

ThreadPoolExecutor ile daha fazla kontrol sağlayın:

1ThreadPoolExecutor executor = new ThreadPoolExecutor(
2coreCount, // Temel thread sayısı
3coreCount * 2, // Maksimum thread sayısı
460, // Boş threadleri tutma süresi
5TimeUnit.SECONDS,
6new LinkedBlockingQueue<>(100) // Kuyruk kapasitesi
7);

Özet: CPU-yoğun işler için çekirdek sayısı kadar thread, I/O-yoğun işler için 2-3 katı thread kullanın. Üretim ortamında monitoring yaparak ayarlayın.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz