ThreadPoolYürütücü - 1

"Sıradan programcılar, zaman zaman yerine getirmeleri gereken pek çok küçük görevleri olduğu gerçeğini er ya da geç kavrarlar."

"Bir oyun yazıyorsanız, o zaman tek tek karakterlerin gerçekleştirdiği eylemlerdir."

"Bir web sunucusu yazıyorsanız, kullanıcılardan farklı komutlar gelir: bir fotoğraf yükleyin, onu istenen biçime dönüştürün, istediğiniz şablonu uygulayın, vb."

"Er ya da geç, tüm büyük görevler bir dizi küçük, yönetilebilir görevlere bölünür."

"Öyleyse, bu bağlam göz önüne alındığında, ince bir soru ortaya çıkıyor: hepsini nasıl yöneteceksiniz? Dakikada birkaç yüz görev gerçekleştirmeniz gerekiyorsa ne olacak? Her görev için bir iş parçacığı oluşturmak pek mantıklı olmaz. Java makinesi her iş parçacığı için oldukça fazla kaynak ayırır."

"Başka bir deyişle, bir iş parçacığı oluşturmak ve yok etmek, görevin kendisinden daha fazla zaman ve kaynak gerektirebilir."

"Java'nın yaratıcıları bu soruna zarif bir çözüm buldular: ThreadPoolExecutor .

" ThreadPoolExecutor , içinde iki şey bulunan bir sınıftır:"

A)  Programda ortaya çıktıkça görev ekleyebileceğiniz bir görev kuyruğu.

B) Bu görevleri gerçekleştiren bir grup iş parçacığı olan iş parçacığı havuzu.

"Dahası, iş parçacıkları bir görev bittiğinde yok olmaz. Bunun yerine, yeni bir görev ortaya çıkar çıkmaz başlamaya hazır olmak için uykuya dalarlar."

"Bir ThreadPoolExecutor oluşturduğunuzda , oluşturulacak maksimum iş parçacığı sayısını ve kuyruğa alınabilecek maksimum görev sayısını ayarlayabilirsiniz. Diğer bir deyişle, iş parçacığı sayısını örneğin 10 ile sınırlayabilirsiniz. sıraya alınmış görevler 100'e."

" ThreadPoolExecutor şu şekilde çalışır:"

1)  Yeni bir görev eklediğinizde sıranın sonuna yerleştirilir.

2)  Kuyruk doluysa istisna atılır.

3)  Bir görevi tamamladıktan sonra, her iş parçacığı kuyruktaki bir sonraki görevi alır ve yürütmeye başlar.

4) Kuyrukta görev yoksa, yeni görevler eklenene kadar bir iş parçacığı uyku moduna geçer.

"İşçi iş parçacığı sayısını sınırladığımız yaklaşım, ne kadar çok iş parçacığımız varsa, o kadar çok birbirine müdahale etmesi açısından avantajlıdır. 5-10 işçi iş parçacığı ve uzun bir görev kuyruğuna sahip olmak çok daha etkilidir. bellek, işlemci süresi, veritabanı erişimi, vb. kaynaklar için birbiriyle rekabet edecek bir görev artışı için 100 iş parçacığı oluşturmak."

"İşte iş başında bir ThreadPoolExecutor örneği:"

Örnek
ExecutorService service = Executors.newFixedThreadPool(2);

for(int i = 0; i < 10; i++)
{
 service.submit(new Runnable() {
    public void run()
    {
     // Here we download something big from the Internet.
    }
 });
}

"Şey, görmüyorum..."

" newFixedThreadPool yöntemi çağrıldığında bir ThreadPoolExecutor nesnesi oluşturulur."

Yani kullanımı çok kolaydır. Gönderme yöntemiyle ona bir görev eklediğinizde, o:

A)  Görevi yürütmek için varsa uyuyan bir iş parçacığını uyandırır.

B)  Bekleyen iş parçacığı yoksa görev için yeni bir iş parçacığı oluşturur.

C)  Maksimum iş parçacığı sayısına ulaşılırsa, görevi kuyruğun sonuna koyar.

"Örneğe kasıtlı olarak 'burada internetten büyük bir şey indiriyoruz'u ekledim. Eğer 'İnternetten büyük bir şey indir' 100 görevimiz varsa, o zaman bunların çoğunu aynı anda çalıştırmanın bir anlamı yoktur; İnternet bağlantımızın bant genişliği sınırı tarafından geride tutulacağız. Bu durumda, birkaç iş parçacığı yeterli olacaktır. Yukarıdaki örnekte gördüğünüz şey bu:"

ExecutorService service = Executors.newFixedThreadPool(2);

"Bir sürü görevle çalışmanın o kadar da zor olmadığı ortaya çıktı."

"Evet. Tahmin edebileceğinden bile daha kolay. Ama Kim sana bunu anlatacak."