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:
1Çekirdek sayısı: 8CPU-yoğun iş için ExecutorService oluşturun:
1import java.util.concurrent.*;23public class ThreadPoolExample {4public static void main(String[] args) {5int poolSize = Runtime.getRuntime().availableProcessors();6ExecutorService executor = Executors.newFixedThreadPool(poolSize);78// 10 görev gönder9for (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ülasyonu15long sum = 0;16for (long j = 0; j < 100_000_000; j++) {17sum += j;18}19});20}2122executor.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-12Görev 2 çalışıyor: pool-1-thread-23Görev 3 çalışıyor: pool-1-thread-34Görev 4 çalışıyor: pool-1-thread-45Gö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 thread2ExecutorService 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üresi5TimeUnit.SECONDS,6new LinkedBlockingQueue<>(100) // Kuyruk kapasitesi7);Ö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.
0 yorum