Метод countDown
Метод countDown класса CountDownLatch
уменьшает текущее значение счетчика на единицу.
Метод не принимает параметров и не возвращает
результата. Когда счетчик достигает нуля,
все потоки, ожидающие на методе await,
освобождаются и продолжают выполнение. Если
счетчик уже равен нулю, вызов метода
countDown ничего не меняет.
Синтаксис
latch.countDown()
Пример
Давайте создадим защелку со счетчиком 3
и запустим три потока, каждый из которых
выполняет работу и вызывает countDown.
Главный поток ожидает завершения всех трех:
import java.util.concurrent.CountDownLatch;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
CountDownLatch latch = new CountDownLatch(3);
for (int i = 1; i <= 3; i++)
{
final int id = i;
new Thread(() -> {
System.out.println("Thread " + id + " started");
latch.countDown();
System.out.println("Thread " + id + " finished");
}).start();
}
latch.await();
System.out.println("All threads finished");
}
}
Результат выполнения кода:
"Thread 1 started"
"Thread 1 finished"
"Thread 2 started"
"Thread 2 finished"
"Thread 3 started"
"Thread 3 finished"
"All threads finished"
Пример
Давайте проверим, что после достижения нуля
повторный вызов countDown не изменяет
состояние защелки. Выведем значение счетчика
через метод getCount:
import java.util.concurrent.CountDownLatch;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
CountDownLatch latch = new CountDownLatch(1);
System.out.println("Before: " + latch.getCount());
latch.countDown();
System.out.println("After first: " + latch.getCount());
latch.countDown();
System.out.println("After second: " + latch.getCount());
}
}
Результат выполнения кода:
"Before: 1"
"After first: 0"
"After second: 0"
Смотрите также
-
класс
CountDownLatch,
который синхронизирует потоки по счетчику -
метод
await,
который блокирует поток до обнуления счетчика -
класс
CyclicBarrier,
который синхронизирует потоки в одной точке -
класс
Semaphore,
который ограничивает число одновременных потоков