Java-поток ждет и уведомляет

У меня есть два потока. Thread A вытягивает некоторые элементы из очереди, а поток B добавляет некоторые элементы в очередь.

Я хочу, чтобы поток A заснул, когда очередь пуста.

Когда поток B добавляет некоторый элемент в очередь, он должен убедиться, что поток A работает. Как это можно сделать на Java?

Ответ 1

Используйте BlockingQueue, который:

A Queue, который дополнительно поддерживает операции, которые ждут, когда очередь становится непустой при извлечении элемента, и подождите, пока пространство станет доступным в очереди при хранении элемента.

Серьезно, не пытайтесь изобретать колесо здесь.





(Если вы должны использовать wait/notify, прочитайте этот учебник, но избавьте себя от боли, пожалуйста!)

Ответ 2

Вот несколько деталей:

import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();

Это все, что связано с новыми возможностями потоковой передачи Java. Исполнитель - пул потоков с someNumberOfThreads в нем. Он питается блокирующей очередью. Все потоки спать, пока не будет работы. Когда вы вызываете объект Runnable в очередь с помощью метода execute(), объект Runnable находится в очереди до тех пор, пока не будет доступен поток для его обработки. Затем вызывается метод run(). Наконец, метод shutdownNow() сигнализирует о завершении всех потоков в пуле.

Это намного проще, чем раньше.

(Существует множество вариаций, таких как пулы с минимальным и максимальным количеством потоков или очереди с максимальными размерами до того, как потоки, вызывающие execute(), будут блокироваться.)