Здається, неможливо зробити кешований пул потоків з обмеженням кількості потоків, які він може створити.
Ось як статичний Executors.newCchedThreadPool реалізований у стандартній бібліотеці Java:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Отже, використовуючи цей шаблон, щоб продовжити, щоб створити кешований пул потоків фіксованого розміру:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Тепер якщо ви скористаєтесь цим і подасте 3 завдання, все буде добре. Якщо подати будь-які подальші завдання, це призведе до відхилених винятків виконання.
Спробуйте це:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
У результаті всі потоки будуть виконані послідовно. Тобто пул потоків ніколи не складе більше ніж один потік для обробки ваших завдань.
Це помилка в методі Execute ThreadPoolExecutor? А може, це навмисно? Або є якийсь інший шлях?
Редагувати: я хочу щось точно схоже на пул кешованих ниток (він створює нитки на вимогу, а потім вбиває їх через деякий час очікування), але з обмеженням кількості потоків, які він може створити, і можливість продовжувати чергувати додаткові завдання після того, як у нього з'явиться досягти межі потоку. Відповідно до відповіді sjlee, це неможливо. Дивлячись на метод Execute () ThreadPoolExecutor, це справді неможливо. Мені потрібно підкласифікувати ThreadPoolExecutor і переосмислити Execute (), як SwingWorker, але те, що SwingWorker робить у його Execute (), є повним хаком.