Tek bir iş parçacığının paralel olarak gerçekleştirilebilen G / Ç yoğun görevler ürettiği bir çözümü kodlamaya çalışıyorum. Her görevin önemli bellek içi verileri vardır. Bu yüzden, bir anda bekleyen görevlerin sayısını sınırlayabilmek istiyorum.
ThreadPoolExecutor'ı şu şekilde oluşturursam:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Ardından, sıra dolduğunda ve tüm iş parçacıkları meşgul olduğunda executor.submit(callable)
atar RejectedExecutionException
.
executor.submit(callable)
Kuyruk dolu ve tüm iş parçacıkları meşgul olduğunda blok yapmak için ne yapabilirim ?
DÜZENLEME : Denedim bu :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Ve benim elde etmek istediğim etkiyi bir şekilde elde ediyor, ancak uygun olmayan bir şekilde (temelde reddedilen iş parçacıkları çağıran iş parçacığında çalıştırılır, bu nedenle bu, çağıran iş parçacığının daha fazlasını göndermesini engeller).
DÜZENLEME: (soruyu sorduktan 5 yıl sonra)
Bu soruyu ve cevaplarını okuyan herkese, lütfen kabul edilen yanıtı tek bir doğru çözüm olarak almayın. Lütfen tüm cevapları ve yorumları okuyun.