Ожидание завершения потоков с помощью CountDownLatch
Last updated: 7 мая 2025 г.CountDownLatch
– нужен когда требуется чтобы какой-то поток ждал пока не выполняться какое-то количество потоков.
В примере ниже мейн останавливает свою работу с помощью await
и когда в потоках вызовется countDown
три раза, мейн продолжает свою работу.
Пример программы:
1import java.io.*;
2import java.util.concurrent.CountDownLatch;
3
4public class CountDownLatchExample {
5 public static void main(String[] args) {
6 int sleeptime = 0;
7 CountDownLatch resources = new CountDownLatch(3);
8 //запускаем 4 потока. каждый поток будет
9 //уменьшать на единицу число, которое указано
10 //в CountDownLatch. у нас 3.
11 for (int i = 1; i < 11; i++) {
12 SomeThread t = new SomeThread();
13 t.setName("Thread " + i);
14 t.resources = resources;
15 sleeptime=200;
16 t.sleeptime = sleeptime;
17 t.start();
18 }
19 try {
20 System.out.println(
21 Thread.currentThread().getName()+" is stopped");
22 //этот текущий поток (то есть поток мейна)
23 //будет остановлен пока счетчик resources
24 //не будет ноль
25 resources.await();
26 }
27 catch(InterruptedException e){}
28 System.out.println(
29 Thread.currentThread().getName()+" is alive again");
30 }
31}
32
33class SomeThread extends Thread{
34 int sleeptime;
35 CountDownLatch resources;
36 @Override
37 public void run() {
38 try{
39 Thread.sleep(sleeptime);
40 }
41 catch (InterruptedException e){}
42 //поток выполнился. уменьшаем счетчик на 1
43 resources.countDown();
44 System.out.println(
45 Thread.currentThread().getName()+" finished working");
46 }
47}
Вывод:

Из консоли видно, что три потока завершили свое выполнение и сразу после этого ожил мейн.
Следующие уроки
CyclicBarrier в Java
10
мин.
Корректная остановка потоков с помощью Interrupt
14
мин.
Callable в Java
12
мин.