Мне нужно использовать несколько потоков, некоторые из них запущены, некоторые ждут, пока другие потоки не разбудят их. Допустим, у меня есть поток 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
Map<String,CyclicBarrier>
или что-то подобное, где каждый поток ожидает своего собственногоCyclicBarrier
, и каждый поток, который хочет поговорить с ним, ищет правильный барьер на карте. Но это легко для бодрствования - что вы имели в виду для сна? Сами потоки должны будут проверить, сказал ли им кто-нибудь спать, вы не можете заставить поток приостановить себя. - person RealSkeptic   schedule 20.10.2016