У меня есть серверная программа, которая принимает клиентские соединения. Эти клиентские подключения могут принадлежать многим потокам. Например, два или более клиентов могут принадлежать к одному потоку. Из этих потоков я должен передать одно сообщение, но я должен подождать, пока все потоки не будут установлены. Для этого я поддерживаю следующую структуру данных.
ConcurrentHashMap<Integer, AtomicLong> conhasmap = new ConcurrentHashMap<Integer, AtomicLong>();
Целое число - это идентификатор потока, а Long - номер клиента. Чтобы заставить один поток для данного потока ждать, пока AtomicLong достигнет определенного значения, я использовал следующий цикл. Фактически первый пакет потока помещает в него идентификатор потока и количество соединений для ожидания. С каждым подключением я уменьшаю количество подключений до ожидания.
while(conhasmap.get(conectionID) != new AtomicLong(0)){
// Do nothing
}
Однако этот цикл блокирует другие потоки. Согласно этому ответу, он выполняет непостоянное чтение. Как я могу изменить код, чтобы дождаться правильного потока для данного потока, пока он не достигнет определенного значения?
Condition
? - person fge   schedule 21.01.2015while(conhasmap.get(conectionID) != new AtomicLong(0))
ерунда. Что бы ни возвращалget
, он никогда не может быть идентичным экземпляру, который вы только что создали с помощьюnew
; так что он будет зацикливаться вечно. Но он не блокирует другие потоки, замедляя работу всей вашей машины, потому что вы выполняете цикл опроса, да, но не блокируете. - person Holger   schedule 23.01.2015