Поток Java ждет и уведомляет
-
05-07-2019 - |
Вопрос
У меня есть две темы. Поток A вытягивает некоторые элементы из очереди, а поток B добавляет некоторые элементы в очередь. Р>
Я хочу, чтобы поток A перешел в спящий режим, когда очередь пуста.
Когда поток B добавляет некоторый элемент в очередь, он должен убедиться, что поток A работает. Как это можно сделать на Java? Р>
Решение
Используйте BlockingQueue код>
, который:
Queue
, который дополнительно поддерживает операции, которые ожидают, когда очередь станет непустой при извлечении элемента, и ждут, пока пространство станет доступным в очереди при хранении элемента. Р>
Серьезно, не пытайтесь изобретать велосипед здесь.
:
(Если вы должны использовать ожидание / уведомление, прочитайте это руководство . Но избавьте себя от боли, пожалуйста!)
Другие советы
Вот некоторые подробности:
import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();
Вот и все, что нужно сделать с помощью новых возможностей потоков Java. Executor - это пул потоков с некоторым количеством NumberOfThreads. Питается блокирующей очередью. Все потоки спят, если нет работы. Когда вы помещаете объект Runnable в очередь с помощью метода execute (), объект Runnable остается в очереди до тех пор, пока не станет доступным поток для его обработки. Затем вызывается метод run (). Наконец, метод shutdownNow () сигнализирует о завершении всех потоков в пуле.
Теперь все намного проще, чем раньше.
(Существует множество вариаций, таких как пулы с минимальным и максимальным количеством потоков или очереди с максимальными размерами, прежде чем потоки, вызывающие execute (), будут блокироваться.)