Я использую ExecutorService для удобства параллельной многопоточной программы. Возьмите следующий код:
while(xxx)
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
Future<..> ... = exService.submit(..);
...
}
В моем случае проблема заключается в том, что submit() не блокируется, если заняты все NUMBER_THREADS. Следствием этого является то, что очередь задач наводняется многими задачами. Следствием этого является то, что закрытие службы выполнения с помощью ExecutorService.shutdown() занимает много времени (ExecutorService.isTerminated() будет ложным в течение длительного времени). Причина в том, что очередь задач все еще достаточно полная.
В настоящее время моим обходным решением является работа с семафорами, чтобы запретить иметь много записей внутри очереди задач ExecutorService:
...
Semaphore semaphore=new Semaphore(NUMBER_THREADS);
while(xxx)
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
semaphore.aquire();
// internally the task calls a finish callback, which invokes semaphore.release()
// -> now another task is added to queue
Future<..> ... = exService.submit(..);
...
}
Я уверен, что есть лучшее более инкапсулированное решение?