Метод signalAll
Метод signalAll класса Condition пробуждает все потоки, которые в данный момент ожидают на этом условии. Потоки, вызвавшие метод await, переходят из состояния ожидания в состояние готовности к выполнению. Метод не принимает параметров и не возвращает значения. Вызывать signalAll можно только при удерживаемой блокировке, связанной с данным объектом Condition, иначе будет выброшено исключение IllegalMonitorStateException. В отличие от метода signal, который пробуждает только один поток, signalAll будит все ожидающие потоки.
Синтаксис
condition.signalAll()
Пример
Давайте создадим поток, который ждет сигнала на условии, и главный поток, который пробуждает его через 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();
Thread worker = new Thread(() -> {
lock.lock();
try
{
System.out.println("Worker is waiting");
condition.await();
System.out.println("Worker is awakened");
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
finally
{
lock.unlock();
}
});
worker.start();
Thread.sleep(100);
lock.lock();
try
{
condition.signalAll();
}
finally
{
lock.unlock();
}
}
}
Результат выполнения кода:
"Worker is waiting"
"Worker is awakened"
Пример
Давайте создадим три потока, ожидающих на одном условии, и разбудим их все одним вызовом 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();
for (int i = 1; i <= 3; i++)
{
int id = i;
new Thread(() -> {
lock.lock();
try
{
System.out.println("Thread " + id + " is waiting");
condition.await();
System.out.println("Thread " + id + " is awakened");
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
finally
{
lock.unlock();
}
}).start();
}
Thread.sleep(200);
lock.lock();
try
{
System.out.println("Calling signalAll");
condition.signalAll();
}
finally
{
lock.unlock();
}
}
}
Результат выполнения кода:
"Thread 1 is waiting"
"Thread 2 is waiting"
"Thread 3 is waiting"
"Calling signalAll"
"Thread 1 is awakened"
"Thread 2 is awakened"
"Thread 3 is awakened"
Смотрите также
-
метод
signal,
который пробуждает один ожидающий поток -
метод
await,
который переводит поток в ожидание -
класс
Condition,
который представляет условие для ожидания потоков -
класс
ReentrantLock,
который является блокировкой для работы с условиями