Поскольку вы фактически удерживаете каждый отправленный Future
в списке фьючерсов, выполняя это:
List< Future<?>> futures = new ArrayList<>();
for(Runnable task : taskList) {
futures.add(es.submit(task));
}
Вы можете очень легко проверить, все ли выполненные задания выполняются, просто вызвав метод Future#isDone
, который вернет true или false в зависимости от того, завершена ли задача или нет. Подробнее об этом вы можете узнать в соответствующей документации здесь .
Следовательно, учитывая вышесказанное, вы вполне можете создать простой вспомогательный метод, который будет перебирать список ваших фьючерсов и проверять их состояние. Например:
private boolean areJobsDone() {
return futures.stream()
.allMatch(Future::isDone);
}
Обратите внимание, что в отличие от метода Future#get
, isDone
не является блокирующим (так как не ожидает, пока задача вернет свой результат), поскольку он эффективно запрашивает свое состояние.
С этим вы можете пойти дальше и проверить состояние ваших исполняемых файлов, заблокировав поток с помощью цикла, который вызовет вспомогательный метод, прежде чем продолжить.
Надеюсь, это поможет.