Ожидание завершения потоков с помощью CountDownLatch

CountDownLatch – нужен когда требуется чтобы какой-то поток ждал пока не выполняться какое-то количество потоков.

В примере ниже мейн останавливает свою работу с помощью await и когда в потоках вызовется countDown три раза, мейн продолжает свою работу.

Пример программы:

import java.io.*; import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) { int sleeptime = 0; CountDownLatch resources = new CountDownLatch(3); //запускаем 4 потока. каждый поток будет //уменьшать на единицу число, которое указано //в CountDownLatch. у нас 3. for (int i = 1; i < 11; i++) { SomeThread t = new SomeThread(); t.setName("Thread " + i); t.resources = resources; sleeptime=200; t.sleeptime = sleeptime; t.start(); } try { System.out.println( Thread.currentThread().getName()+" is stopped"); //этот текущий поток (то есть поток мейна) //будет остановлен пока счетчик resources //не будет ноль resources.await(); } catch(InterruptedException e){} System.out.println( Thread.currentThread().getName()+" is alive again"); } } class SomeThread extends Thread{ int sleeptime; CountDownLatch resources; @Override public void run() { try{ Thread.sleep(sleeptime); } catch (InterruptedException e){} //поток выполнился. уменьшаем счетчик на 1 resources.countDown(); System.out.println( Thread.currentThread().getName()+" finished working"); } }

Вывод:

Из консоли видно, что три потока завершили свое выполнение и сразу после этого ожил мейн.

CyclicBarrier в Java

Изучите CyclicBarrier в Java: как синхронизировать потоки и запускать дополнительное действие после завершения заданного количества потоков. Пример кода и объяснение работы.
Time to read: 10

Корректная остановка потоков с помощью Interrupt

Узнайте, как правильно останавливать потоки в Java с помощью interrupt(). Почему Thread.stop() опасен и как использовать isInterrupted() для безопасного завершения работы потоков.
Time to read: 14

Callable в Java

Callable vs Runnable: как возвращать результат из потока в Java. Примеры использования FutureTask для получения результатов асинхронных операций.
Time to read: 12