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

Метод 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,
    который является блокировкой для работы с условиями
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить