Как узнать, опрашивает ли другой поток SynchronousQueue? - PullRequest
0 голосов
/ 16 декабря 2018

У меня очень непонятный вариант использования, но по сути мне нужно знать, выполняет ли SynchronousQueue другой поток poll (с таймаутом), и он хочет вставить элемент и разблокировать его.

Есть ли какой-либопростой способ сделать это?Из моего наивного кода чтения javadoc и кода кажется, что нет, но я думал, что проверю с SOE.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Таким образом, после ряда решений (пользовательская очередь, отдельная изменяемая переменная для отслеживания вставки) это оказалось очень простым решением с использованием метода offer:

/**
 * Inserts the specified element into this queue, if another thread is
 * waiting to receive it.
 *
 * @param e the element to add
 * @return {@code true} if the element was added to this queue, else
 *         {@code false}
 * @throws NullPointerException if the specified element is null
 */
public boolean offer(E e) {
    if (e == null) throw new NullPointerException();
    return transferer.transfer(e, true, 0) != null;
}

Если я просто сделаю if(offer(e)) ... else ..., это поможетразблокировать потребителя, если есть.

0 голосов
/ 16 декабря 2018

Что если вы внедрили эту логику, и ваш поток производителя добавляет значение в очередь каждый раз, когда обнаруживает, что другой поток заблокирован на poll - где гарантируется, что значение, которое ваш производитель помещает в очередь, будет использовано этим потокома не другое?

Предложите изменить свой дизайн.Producer - поток, который добавляет значения в очередь - не должен ничего знать о потребителях.Сделать вам выдает запрос потребителя.Я имею в виду определить другую очередь и сделать ваш текущий поток, который заставляет poll отправлять request.И ваш текущий поток производителей принимает запросы из этой новой очереди и выполняет запрос.Вы можете реализовать объект запроса так, чтобы он работал как посредник между двумя потоками.

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