Я пишу код для сетевого приложения. Поэтому я использую LinkedBlockingQueue для хранения входящих сообщений, пока они не будут использованы. Следующий код выполняется в собственном потоке и заполняет очередь:
while(true) {
String msg = in.readLine();
if(msg == null) continue;
recieveQueue.offer(msg);
System.out.println("recieveQueue.offer() called at: " + System.currentTimeMillis() + " hash:" + recieveQueue.hashCode());
System.out.println("Server recieved: " + msg.replace("\n", ""));
break;
}
Затем я написал метод, который работает в том же «основном потоке» (для этого метода не создается дополнительный поток). Он вызывается только тогда, когда необходимо использовать сохраненные элементы. Это выглядит следующим образом:
public String recieveMessage() {
try {
System.out.println("recieveQueue.take() called at: " + System.currentTimeMillis() + " hash:" + recieveQueue.hashCode());
return recieveQueue.take();
}catch(InterruptedException e) {
e.printStackTrace();
return null;
}
}
При запуске этого кода я получаю следующий результат:
recieveQueue.offer() called at: 1594558123030 hash:2091496189
Server recieved: CONFIRMED
recieveQueue.take() called at: 1594558123031 hash:2091496189
ha sh проверяет, что я работаю с той же очередью, и, как видно из Time, recieveQueue.offer (msg) определенно вызывается перед take (), и поэтому очередь должна содержать сообщение. Но Программа останавливается на вызове take (). Никаких исключений не было, и в коде нет другого места, где вызывается take (). Я ждал около 10 минут, но вызов take () так и не завершился