РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1025 of 1163 menu

Метод await

Метод await класса Condition приостанавливает текущий поток и освобождает связанную блокировку до тех пор, пока другой поток не вызовет методы signal или signalAll, либо пока текущий поток не будет прерван. Метод не принимает параметров и возвращает void. Перед вызовом метода поток должен удерживать блокировку, связанную с объектом Condition.

Синтаксис

condition.await()

Пример

Давайте создадим два потока: один ждет сигнала через await, а второй отправляет сигнал через signal:

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); Thread waiter = new Thread(() -> { lock.lock(); try { System.out.println("Waiter: waiting..."); condition.await(); System.out.println("Waiter: resumed"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } }); Thread signaler = new Thread(() -> { lock.lock(); try { System.out.println("Signaler: signaling"); condition.signal(); } finally { lock.unlock(); } }); waiter.start(); Thread.sleep(500); signaler.start(); waiter.join(); signaler.join(); } }

Результат выполнения кода:

Waiter: waiting... Signaler: signaling Waiter: resumed

Пример

Давайте используем await в связке с signalAll для пробуждения нескольких потоков:

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); Runnable task = () -> { lock.lock(); try { System.out.println(Thread.currentThread().getName() + ": waiting"); condition.await(); System.out.println(Thread.currentThread().getName() + ": done"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } }; Thread t1 = new Thread(task, "T1"); Thread t2 = new Thread(task, "T2"); t1.start(); t2.start(); Thread.sleep(500); lock.lock(); try { condition.signalAll(); } finally { lock.unlock(); } t1.join(); t2.join(); } }

Результат выполнения кода:

T1: waiting T2: waiting T1: done T2: done

Смотрите также

  • класс Condition,
    который управляет ожиданием потоков
  • метод signal,
    который пробуждает один ожидающий поток
  • метод signalAll,
    который пробуждает все ожидающие потоки
  • класс ReentrantLock,
    который создает объект Condition
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить