Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top