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(), будут блокироваться.)