Поток Java ждет и уведомляет - PullRequest
10 голосов
/ 05 мая 2009

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

Я хочу, чтобы поток A перешел в спящий режим, когда очередь пуста.

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

Ответы [ 2 ]

21 голосов
/ 05 мая 2009

Используйте BlockingQueue, что:

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

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




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

2 голосов
/ 05 мая 2009

Вот некоторые детали:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...