Java take () Метод LinkedBlockingQueue зависает, даже если очередь не должна быть пустой - PullRequest
0 голосов
/ 12 июля 2020

Я пишу код для сетевого приложения. Поэтому я использую 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 () так и не завершился

1 Ответ

0 голосов
/ 12 июля 2020

В вашу программу внесены некоторые изменения.

Примечание: пожалуйста, отметьте свой код Consumer in while l oop.

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Main
{
    public static void main(String[] args) {
    BlockingQueue recieveQueue = new LinkedBlockingQueue<String>(10);
    
    new Thread(){
       public void run(){
       int count=0;
          while(true) {
                    count++;
                    String msg = "AAA:"+count;
                    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", ""));
          }
       } 
    }.start();
    
    while(true){
        try {
            System.out.println("recieveQueue.take() called at: " + System.currentTimeMillis() + "    hash:" + recieveQueue.hashCode());
            System.out.println("recieveQueue.take() : "+recieveQueue.take());
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    
 }
}
...