Найти тему
81 подписчик

Параллелизм в Java и интерфейс Condition


Благодаря этой статье вы узнаете, как заставить потоки ожидать определенных условий с помощью интерфейса Condition.

Используя Condition, мы можем создавать механизмы, которые позволяют потокам ожидать выполнения определенных условий, прежде чем приступить к их выполнению.

public interface Condition {

void await() throws InterruptedException;

void awaitUninterruptibly();

long awaitNanos(long nanosTimeout) throws InterruptedException;

boolean await(long time, TimeUnit unit) throws InterruptedException;

boolean awaitUntil(Date deadline) throws InterruptedException;

void signal();

void signalAll();
}

Интерфейс Condition связан с интерфейсом Lock. Поток не может взаимодействовать с Condition и его методами, если они не удерживаются с помощью Lock.

Condition использует базовые механизмы Lock. Например, signal и signalAll будет использовать базовую очередь потоков, которые поддерживаются Lock, и уведомит их о пробуждении.

Отличие между этими двумя интерфейсами состоит в том, что реализации Lock представляют собой высокоуровневую альтернативу блока synchronized, а реализации интерфейса Condition – это альтернатива методам notify/wait. Оба этих интерфейса входят в пакет java.util.concurrent.locks.

Одной из очевидных вещей, которые реализуются с помощью Condition, является файл BlockingQueue. Рабочие потоки (worker threads) обрабатывают данные, а потоки-издатели (publisher threads) отправляют данные. Данные публикуются в очереди, рабочие потоки будут обрабатывать данные из очереди, а если данных нет в очереди, то они должны находиться в режиме ожидания.

Для рабочего потока, если условие выполняется, процесс работы выглядит следующим образом:

1. Получить lock.
2. Проверить состояние.
3. Обработать данные.
4. Освободить lock.

Если условие не выполняется, процесс изменится:


Параллелизм в Java и интерфейс Condition  Благодаря этой статье вы узнаете, как заставить потоки ожидать определенных условий с помощью интерфейса Condition.
1 минута