Ответ 1
Нет чистого способа проверить, все ли Runnables выполнены, если вы используете ExecutorService.execute(Runnable)
. Если вы не создадите механизм для этого в самом Runnable (что, на мой взгляд, небрежно).
Вместо этого:
Используйте ExecutorService.submit(Runnable)
. Этот метод возвращает Future<?>
, который является дескриптором результата Runnable
. Использование Futures обеспечивает простой способ проверки результатов.
Все, что вам нужно сделать, это сохранить список отправленных вами фьючерсов, а затем вы можете выполнить итерацию по всему списку фьючерсов, а также:
А) дождитесь, пока все фьючерсы будут сделаны блокирующим способом или
Б) проверьте, все ли фьючерсы сделаны неблокирующим способом.
Вот пример кода:
List<Future<?>> futures = new ArrayList<Future<?>>();
ExecutorService exec = Executors.newFixedThreadPool(5);
// Instead of using exec.execute() use exec.submit()
// because it returns a monitorable future
while((item = stack.pollFirst()) != null){
Runnable worker = new Solider(this, item);
Future<?> f = exec.submit(worker);
futures.add(f);
}
// A) Await all runnables to be done (blocking)
for(Future<?> future : futures)
future.get(); // get will block until the future is done
// B) Check if all runnables are done (non-blocking)
boolean allDone = true;
for(Future<?> future : futures){
allDone &= future.isDone(); // check if future is done
}