Как узнать завершился ли пул потоков ExecutorService?

233
30 марта 2018, 12:50

Доброго времени суток. Есть код:

ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 3; i++) {
            executorService.execute(new ParallelRunnable(parallelGraph, parallelLineData, i));
    }

Он создает пулл потоков. Вопрос такой: как отловить завершение всех потоков этого екзекутора и по завершению выполнить код. Действия происходят на андроид.

Answer 1

Самый топорный метод - ожидание остановки пула:

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(() -> {
                     // Здесь выполнить действие
                 });
READ ALSO
SpringMVC контроллер вызывается 3 раза

SpringMVC контроллер вызывается 3 раза

Доброго времени сутокЕсть код:

206
Выделение ячеек в GridView?

Выделение ячеек в GridView?

ячейку при нажатии,какой обработчик делает жто?

212
Скачивание файла с прогрессом

Скачивание файла с прогрессом

Доброго времени сутокМне надо способ скачивать множество файлов одновременно по определённому пути в определённый каталог

211
Ссылки с помощью SpannableStringBuilder

Ссылки с помощью SpannableStringBuilder

Как убрать линии, которые находятся под текстом?

197