Метод 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