Çok iş parçacıklı bir uygulama geliştirirken, genellikle iş parçacıklarını organize etmekle uğraşmalıyız. Uygulamamız ne kadar büyükse ve çok izlekli görevler için ihtiyaç duyduğumuz iş parçacığı sayısı arttıkça,çalıştırılabiliroluşturduğumuz nesneler.

Java'da bir iş parçacığı oluşturmanın oldukça pahalı bir işlem olduğu burada belirtilmelidir. Bir işlemi gerçekleştirmek için her seferinde iş parçacığının yeni bir örneğini oluşturursak, performansta ve sonuç olarak uygulamanın sağlığında büyük sorunlar yaşarız.

Burada bir iş parçacığı havuzu ve ThreadPoolExecutor yardımımıza koşuyor.

Bir iş parçacığı havuzu, önceden başlatılmış bir dizi iş parçacığıdır. Büyüklüğü sabit veya değişken olabilir.

İş parçacığından daha fazla görev varsa, görevler bir görev kuyruğunda bekler. Havuzdaki N'inci iş parçacığı, sıradan bir görev alır ve bu iş tamamlandıktan sonra iş parçacığı, sıradan yeni bir görev alır. Sıradaki tüm görevler yürütüldüğünde, iş parçacıkları etkin kalır ve yeni görevler için bekler. Yeni görevler göründüğünde, iş parçacıkları da bunları yürütmeye başlar.

ThreadPoolYürütücü

Java 5'ten başlayarak, Executor çerçevesi çok iş parçacıklı bir çözüm kazandı. Genel olarak, birçok bileşeni vardır ve amacı, kuyrukları ve iş parçacığı havuzlarını verimli bir şekilde yönetmemize yardımcı olmaktır.

Ana arayüzler Executor ve ExecutorService'dir .

Yürütücü , tek bir geçersiz yürütme (Runnable runnable) yöntemine sahip bir arabirimdir.

Bir görevi bu yöntemin bir uygulamasına geçirirken, bunun gelecekte eşzamansız olarak yürütüleceğini bilin.

ExecutorService — Yürütücü arabirimini genişletenve görevleri yürütmek için yetenekler ekleyen bir arabirim. Ayrıca çalışan bir görevi kesintiye uğratmak ve iş parçacığı havuzunu sonlandırmak için yöntemleri vardır.

ThreadPoolExecutor, Executor ve ExecutorService arayüzlerini uygularve görev oluşturmayı görev yürütmeden ayırır. Runnable nesnelerini uygulamamızve bunları bir uygulayıcıya göndermemiz gerekiyor. ThreadPoolExecutor , görevleri yürütmekten ve iş parçacıkları oluşturmaktan ve bunlarla çalışmaktan sorumludur.

Yürütülmek üzere bir görev gönderildikten sonra, havuzdaki mevcut bir iş parçacığı kullanılır. Bu, performansı artırır. Yeni bir iş parçacığı oluşturup başlatırken ve ardından iş parçacığıyla işimiz bittiğinde tekrar çöp toplamada kaynakların boşa harcanması sorununu çözer.

ThreadPoolExecutor'ın 4 kurucusu vardır:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

ThreadPoolExecutor yapıcısı aşağıdaki parametrelere sahiptir :

çekirdekHavuzBoyutu Bu parametre, yürütücü hizmeti başladığında kaç iş parçacığının hazır (başlatılmış) olacağını gösterir.
maksimumHavuzBoyutu Bir yürütme hizmetinin oluşturabileceği maksimum iş parçacığı sayısı.
canlı kalmazamanı Serbest bırakılan bir iş parçacığının, iş parçacığı sayısı birden fazlaysa yok edilmeden önce yaşamaya devam edeceği süreçekirdekHavuzBoyutu. Zaman birimleri bir sonraki parametrede belirtilir.
birim Zaman birimleri (saat, dakika, saniye, milisaniye, vb.).
iş kuyruğu Görevler için bir sıranın uygulanması.
işleyici Tamamlanamayan görevler için işleyici.
iplik Fabrikası İsteğe bağlı olarak yeni iş parçacıkları oluşturan bir nesne. İş parçacığı fabrikalarının kullanılması, yeni iş parçacığı donanımına yapılan çağrıları bağımsız hale getirerek uygulamaların özel iş parçacığı alt sınıflarını, öncelikleri vb. kullanmasına izin verir.

Bir ThreadPoolExecutor Oluşturma

Executors hizmet sınıfı , bir ThreadPoolExecutor oluşturulmasını basitleştirebilir . Bu yardımcı program sınıfının yöntemleri, birThreadPoolYürütücünesne.

newFixedThreadPool — Herhangi bir sayıda görevi yürütmek için sabit sayıda iş parçacığını yeniden kullanan bir iş parçacığı havuzu oluşturur.

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — İş parçacığı sayısının JVM'nin kullanabileceği işlemci çekirdeği sayısına eşit olduğu bir iş parçacığı havuzu oluşturur. Varsayılan eşzamanlılık düzeyi birdir. Bu, havuzda JVM'de kullanılabilen CPU çekirdeği sayısı kadar iş parçacığının oluşturulacağı anlamına gelir. Eşzamanlılık düzeyi 4 ise çekirdek sayısı yerine iletilen değer kullanılır.

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — Tüm görevleri yürütmek için tek bir iş parçacığına sahip bir havuz oluşturur.

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool — Gerektiğinde yeni iş parçacıkları oluşturan ancak önceden oluşturulmuş iş parçacıkları kullanılabilir olduğunda yeniden kullanan bir iş parçacığı havuzu oluşturur.

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool — Belirli bir gecikmeden sonra veya periyodik olarak yürütülecek komutları programlayabilen bir iş parçacığı havuzu oluşturur.

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

Sonraki derslerde her bir havuz türünü ele alacağız.