Önbelleğe alınmış bir iş parçacığı havuzunun oluşturabileceği iş parçacığı sayısı sınırıyla yapmak imkansız gibi görünüyor.
Statik Executors.newCachedThreadPool, standart Java kitaplığında şu şekilde uygulanır:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Dolayısıyla, bu şablonu kullanarak sabit boyutlu bir önbelleğe alınmış iş parçacığı havuzu oluşturmaya devam edin:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Şimdi bunu kullanır ve 3 görev gönderirseniz, her şey yoluna girecek. Başka görevlerin gönderilmesi, yürütme istisnalarının reddedilmesine neden olacaktır.
Bunu denemek:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Tüm iş parçacıklarının sırayla yürütülmesine neden olur. Yani, iş parçacığı havuzu görevlerinizi yerine getirmek için asla birden fazla iş parçacığı oluşturmaz.
Bu, ThreadPoolExecutor yürütme yönteminde bir hata mı? Ya da belki bu kasıtlı mı? Yoksa başka bir yolu var mı?
Düzenleme: Tam olarak önbelleğe alınmış iş parçacığı havuzu gibi bir şey istiyorum (istek üzerine iş parçacıkları oluşturur ve daha sonra bir zaman aşımından sonra onları öldürür), ancak oluşturabileceği iş parçacığı sayısında bir sınır ve bir kez ek görevleri sıraya koymaya devam etme yeteneği ile iş parçacığı sınırına ulaştı. Sjlee'nin cevabına göre bu imkansız. ThreadPoolExecutor'ın execute () yöntemine bakıldığında bu gerçekten imkansızdır. ThreadPoolExecutor alt sınıfına girmem ve bir şekilde SwingWorker'ın yaptığı gibi execute () 'yi geçersiz kılmam gerekir, ancak SwingWorker'ın execute ()' de yaptığı tam bir hack'tir.