Выполнение заданий Java многопоточным с executorservice?
Как мне реализовать такую функцию?
У меня есть динамическая очередь, которая заполняется в неизвестное время с помощью runnables, которые должны быть выполнены. ExecutorService должен запускать только ограниченное количество потоков, при достижении максимального размера потока он должен прекратить выполнение большего количества потоков, пока не завершится один поток, затем должна быть выполнена следующая задача.
Пока я сталкивался с этим:
ExecutorService executor = new ThreadPoolExecutor(20, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
databaseConnectionQueue);
ExecutorService создается до того, как очередь заполнена, и должна оставаться в живых до тех пор, пока очередь не будет удалена, а не когда она пуста, потому что это может произойти. Кто-нибудь может мне помочь?
2 ответа
ThreadPoolExecutor
не будет отключаться, когда он пуст. Из JavaDoc:
Пул, на который больше нет ссылок в программе И нет оставшихся потоков, будет автоматически отключен.
Я считаю, что вы должны использовать FixedThreadPool (Executors.newFixedThreadPool)
Согласно javadoc [Executors.newFixedThreadPool]
Создает пул потоков, который повторно использует фиксированное число потоков, работающих в общей неограниченной очереди. В любой момент не более nThreads потоков будут активными задачами обработки. Если дополнительные задачи отправляются, когда все потоки активны, они будут ждать в очереди, пока поток не станет доступным. Если какой-либо поток завершается из-за сбоя во время выполнения до завершения работы, новый будет занимать его место, если это необходимо для выполнения последующих задач. Потоки в пуле будут существовать до тех пор, пока он не будет явно отключен.
Надеюсь, поможет. Благодарю.