29 Mart 2018 Perşembe

Executors Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.Executors;
Bu sınıf tamamen static metodlardan oluşan yardımcı bir sınıftır. ExecutorService nesnesi yaratmak içindir.

newCachedThreadPool metodu
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. 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 sanırım 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();
newFixedThreadPool metodu
İmzası şöyle.
public static ExecutorService newFixedThreadPool(int nThreads)
Açıklaması şöyle. Thread sayısı sabit olduğu için hepsi meşgülse işe hemen cevap verilmeyebilir. Ayrıca ani artışlar gösteren (burst) iş sayısına da uyum sağlamayabilir. Bu Executor tipini Swing uygulamasında kısa vadeli işleri (short term) çalıştırmak için kullandım.
Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue. At any point, at most nThreads threads will be active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available. If any thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks. The threads in the pool will exist until it is explicitly shutdown.
Metodun için şöyledir. corePoolSize ve maximumPoolSize aynıdır. keepAliveTime 0'dır . Thread hep yaşar. Kuyruk olarak unbounded kuyruk kullanır. Eğer çok fazla iş eklersek kuyruk unbounded olduğu için bellek bitebilir. Yoğun hesaplama yapılan, yani bekleme yapmayan işlerde tercih edilir.
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
}
LinkedBlockingQueue şöyledir. Yani sınırız sayıda iş alabilir.
public LinkedBlockingQueue() {
    this(Integer.MAX_VALUE);
}
public LinkedBlockingQueue(int capacity) {...}
Bu metod verilen servise üst sınır konulmak istenilirse faydalı. Örneğin aynı anda sadece 4 müşteriye hizmet vermek gibi. Böylece patlama anlarında sisteme aşırı yük binmesini engellenebiliyor. Açıklaması şöyle
Use thread pools to enable graceful degradation of service during traffic bursts
Bu servisi kullanırken dikkat edilmesi gereken tasarım noktası, thread sayısı sınırlı olduğu için yeni işletilmekte olan işin, aynı ExecutorService nesnesine yeni yeni işler ekleyip sonucunun bitmesini beklememesi. Bu durum deadlock (kilitlenme) oluşmasına sebep olabilir. Açıklaması şöyle
Do not execute interdependent tasks in a bounded thread pool
Örnek
Şöyle yaparız.
ExecutorService executorService = Executors.newFixedThreadPool(3);
newFixedThreadPool metodu - int + ThreadFactory
Şöyle yaparız.
String someName="fileName"; // Inside first file 
...........................
.........................

Executors.newFixedThreadPool(30, new 
           ThreadFactoryBuilder().setNameFormat(someName).build());
Daha karmaşık örnekler burada.

newWorkStealingPool metodu
Açıklaması şöyle.
Creates a work-stealing thread pool using all available processors as its target parallelism level.
İmzası şöyle.
public static ExecutorService newWorkStealingPool();


Hiç yorum yok:

Yorum Gönder