Блокирующий набор в Java

Мне нужно использовать несколько потоков, некоторые из них запущены, некоторые ждут, пока другие потоки не разбудят их. Допустим, у меня есть поток A, B, C, D, и я хочу иметь возможность будить/переводить в спящий режим любой поток из любого другого. Так, например, я хочу, чтобы у A была возможность будить/засыпать B, C, D; Я хочу, чтобы B имел возможность пробуждать/засыпать A, C, D и т. д. Для этой цели я решил использовать BlockingQueue, чтобы добавить сообщения в BlockingQueue, т.е.

blockingQueue.put("Start A"); or blockingQueue.put("Stop A"); 

И эта очередь разделяется между всеми потоками, так что каждый поток ждет, пока не появится сообщение для него. Однако такой подход, по-видимому, имеет большой недостаток: когда какой-то поток прослушивает сообщение, которое предназначено для этого потока (поток A ожидает сообщения «Start A» и должен игнорировать все другие сообщения, такие как «Start B» и т. д.), он должен явно проверить, находится ли сообщение для него в очереди, поэтому я должен использовать метод .contains() и написать некоторый код, чтобы реализовать то, что мне нужно. Впрочем, возможно, для этого установлена ​​какая-то блокировка. Набор, который позволит сделать следующее:

blockingSet.get(E) //wait until element E appears in the set

person Andrey Yaskulsky    schedule 20.10.2016    source источник
comment
В вашем вопросе и использовании BlockingQueue есть что-то странное. Не могли бы вы дать нам большую картину? Почему вы хотите, чтобы А спал с Б?   -  person Tobias Otto    schedule 20.10.2016
comment
Вам может понадобиться Map<String,CyclicBarrier> или что-то подобное, где каждый поток ожидает своего собственного CyclicBarrier, и каждый поток, который хочет поговорить с ним, ищет правильный барьер на карте. Но это легко для бодрствования - что вы имели в виду для сна? Сами потоки должны будут проверить, сказал ли им кто-нибудь спать, вы не можете заставить поток приостановить себя.   -  person RealSkeptic    schedule 20.10.2016
comment
@TobiasOtto Я пытаюсь создать что-то вроде небольшой рамки для внутреннего использования. Итак, основная идея заключается в том, что у нас будет много потоков и мы хотим иметь один канал связи между ними, чтобы любой поток мог связаться с любым другим.   -  person Andrey Yaskulsky    schedule 20.10.2016
comment
Что-то вроде этого? en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern. Пожалуйста, посмотрите: stackoverflow.com/questions/3987391/   -  person Tobias Otto    schedule 20.10.2016
comment
@TobiasOtto да, точно, но между потоками, а не между брокерами JMS   -  person Andrey Yaskulsky    schedule 20.10.2016
comment
Все еще не ясно, что именно вы хотите сделать. Вы хотите передавать различные сообщения/команды или просто запускаете и останавливаете определенный поток?   -  person Stanislav Lukyanov    schedule 27.10.2016