Я намагаюся кодувати рішення, в якому один потік виробляє завдання з інтенсивним введенням / виводом, які можна виконувати паралельно. Кожне завдання має значні дані в пам'яті. Тому я хочу мати можливість обмежити кількість завдань, які очікують на даний момент.
Якщо я створюю ThreadPoolExecutor так:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Потім executor.submit(callable)
кидає, RejectedExecutionException
коли черга заповнюється і всі потоки вже зайняті.
Що я можу зробити, щоб executor.submit(callable)
заблокувати, коли черга заповнена і всі потоки зайняті?
EDIT : Я спробував це :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
І це дещо досягає ефекту, якого я хочу досягти, але неелегантно (в основному відхилені потоки запускаються у викличному потоці, тому це блокує викличний потік від подальшої подачі).
РЕДАКТУВАТИ: (через 5 років після запитання)
Будь-хто, хто читає це запитання та відповіді на нього, не приймає прийняту відповідь як одне з правильних рішень. Будь ласка, прочитайте всі відповіді та коментарі.