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.
Если условие не выполняется, процесс изменится:
1 минута
1 июня 2023