Wydaje się, że niemożliwe jest utworzenie buforowanej puli wątków z ograniczeniem liczby wątków, które może ona utworzyć.
Oto jak static Executors.newCachedThreadPool jest zaimplementowane w standardowej bibliotece Java:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Tak więc, używając tego szablonu do utworzenia puli wątków w pamięci podręcznej o stałym rozmiarze:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Teraz, jeśli użyjesz tego i prześlesz 3 zadania, wszystko będzie dobrze. Przesłanie dalszych zadań spowoduje odrzucenie wyjątków wykonania.
Próbuję tego:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Spowoduje, że wszystkie wątki będą wykonywane sekwencyjnie. Oznacza to, że pula wątków nigdy nie utworzy więcej niż jednego wątku do obsługi zadań.
To jest błąd w metodzie wykonywania programu ThreadPoolExecutor? A może jest to zamierzone? Czy jest inny sposób?
Edycja: chcę coś dokładnie takiego jak buforowana pula wątków (tworzy wątki na żądanie, a następnie je zabija po pewnym czasie), ale z ograniczeniem liczby wątków, które może utworzyć i możliwością kontynuowania kolejkowania dodatkowych zadań, gdy ma osiągnął limit wątków. Zgodnie z odpowiedzią sjlee jest to niemożliwe. Patrząc na metodę execute () ThreadPoolExecutor, jest to rzeczywiście niemożliwe. Musiałbym podklasować ThreadPoolExecutor i przesłonić execute (), podobnie jak robi to SwingWorker, ale to, co robi SwingWorker w swoim execute (), to kompletny hack.