Я не уверен, что это будет работать для вашего приложения, но звучит так, как будто это будет. ThreadPoolExecutor
(реализация ExecutorService
) может принимать BlockingQueue
в качестве аргумента, и вы можете просто добавить новые потоки в очередь. Когда вы закончите, вы просто прекратите действие ThreadPoolExecutor
.
private BlockingQueue<Runnable> queue;
...
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, new Long(1000),
TimeUnit.MILLISECONDS, this.queue);
Вы можете вести подсчет всех потоков, добавленных в очередь. Когда вы думаете, что все готово (очередь пуста, возможно?), Просто сравните это с
if (issuedThreads == pool.getCompletedTaskCount()) {
pool.shutdown();
}
Если две пары совпадают, все готово. Другой способ завершить пул - это подождать секунду в цикле:
try {
while (!this.pool.awaitTermination(1000, TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {//log exception...}