У меня есть серверная программа, которая принимает клиентские соединения. Эти клиентские соединения могут принадлежать многим потокам. Например, два или более клиентов могут принадлежать одному и тому же потоку. Из этих потоков я должен пройти одно сообщение, но мне нужно подождать, пока все потоки не будут установлены. Для этого я поддерживаю следующую структуру данных.Как сделать поток до тех пор, пока переменная не достигнет определенного значения (многопоточная Java)
ConcurrentHashMap<Integer, AtomicLong> conhasmap = new ConcurrentHashMap<Integer, AtomicLong>();
Целое - это идентификатор потока и длинный номер клиента. Чтобы сделать один поток для данного потока ждать, пока AtomicLong не достигнет определенного значения, я использовал следующий цикл. Фактически первый пакет потока помещает идентификатор потока и количество ожидающих соединений. С каждым соединением я уменьшаю соединения для ожидания.
while(conhasmap.get(conectionID) != new AtomicLong(0)){
// Do nothing
}
Однако этот цикл блокирует другие потоки. В соответствии с этим answer он выполняет изменчивое считывание. Как я могу изменить код для ожидания правильного потока для данного потока до тех пор, пока он не достигнет определенного значения?
Почему бы не использовать thread.wait() и разбудить его после того, как ваш сервер принимает новое соединение? Другим менее элегантным решением было бы некоторое время спать и проверить ценность. – PbxMan
Использование ['Условие'] (http: // docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html), может быть? – fge
@PbxMan Я жду поток, уже принятый сервером. Да, спят некоторое время, и чтение значения может сработать, однако я ищу лучший способ. – user340