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

Раздел: Многопоточность

В этом разделе вы узнаете, как использовать многопоточность в Java для повышения производительности и параллельной обработки.

Все разделы
Иконка Многопоточность

Ожидание завершения потоков с помощью 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
мин.

Similar Articles Icon
Divider

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

14
мин.

Similar Articles Icon
Divider

Callable в Java

12
мин.

Similar Articles Icon