2 Ocak 2023 Pazartesi

Executors.newCachedThreadPool metodu - Sınırsız Sayıda Thread Kullanır OOM Verebilir

Giriş
Açıklaması şöyle. Kısa süren hemen cevap verilmesi gereken işler için uygundur. Ayrıca ani artışlar gösteren (burst) iş sayısına da uyum sağlar. Şeklen şöyle. Belirtilen süre geçince thread sayısının azaldığı görülebilir

Bu Executor tipini Swing uygulamasında uzun vadeli işleri (long term) çalıştırmak için kullandım.
Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available. These pools will typically improve the performance of programs that execute many short-lived asynchronous tasks. Calls to execute will reuse previously constructed threads if available. If no existing thread is available, a new thread will be created and added to the pool. Threads that have not been used for sixty seconds are terminated and removed from the cache. Thus, a pool that remains idle for long enough will not consume any resources. Note that pools with similar properties but different details (for example, timeout parameters) may be created using ThreadPoolExecutor constructors.
Metodun içi şöyledir. En az 0, en çok 2 milyar küsur thread yaratır. Idle kalan thread 60 saniye içinde sonlanır. SynchronousQueue hemen doluyum cevabı verdiği için yeni bir thread yaratılmasına sebep olur. Bu ThreadPoolExecutor konfigürasyonu hemen işlenmesi gereken, I/O için bekleme yapan veya kısa süreli işler için kullanılır. Örneğin uzak bir sunucuya bir sürü sorgu göndermek gibi. Eğer yanlış kullanırsak bu kod çok fazla thread açmaya çalıştığı için sistemi kilitleyebilir!
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
Örnek
Şöyle yaparız.
ExecutorService executor = Executors.newCachedThreadPool();

Hiç yorum yok:

Yorum Gönder