Доброго времени суток. Есть код:
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executorService.execute(new ParallelRunnable(parallelGraph, parallelLineData, i));
}
Он создает пулл потоков. Вопрос такой: как отловить завершение всех потоков этого екзекутора и по завершению выполнить код. Действия происходят на андроид.
Самый топорный метод - ожидание остановки пула:
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executorService.execute(new ParallelRunnable(parallelGraph, parallelLineData, i));
}
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
// Здесь выполнить действие
} catch (InterruptedException e) {
...
}
Более разумный метод - это координировать завершение работы внутри самих задач:
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
executorService.execute(() -> {
try {
// Выполнение задачи
latch.countDown();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
latch.await();
// Здесь выполнить действие
А самый толковый, на мой взгляд - это использовать CompletableFuture:
ComplatableFuture<Void>[] futures = new ComplatableFuture<>[3];
for (int i = 0; i < 3; i++) {
futures[i] = CompletableFuture.runAsync(new ParallelRunnable(parallelGraph, parallelLineData, i), executorService);
}
CompletableFuture.allOf(futures)
.thenRun(() -> {
// Здесь выполнить действие
});
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени сутокМне надо способ скачивать множество файлов одновременно по определённому пути в определённый каталог