Я использую 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(..);
...
}
Я уверен, что есть лучшее, более инкапсулированное решение?