Java take() Method of LinkedBlockingQueue is stuck, even if the Queue should not be empty

I’m writing Code for a Network Application. Therefor I’m using a LinkedBlockingQueue to store incoming messaged until they are consumed. The following code runs in it’s own Thread and fills up the Queue:

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; } 

Next I wrote a Method, which runs in the same "Main-Thread" (No extra Thread is created for this Method). It’s only called when the stored Elements have to be consumed. It looks like the following:

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;     } } 

When running this Code I get the following output:

recieveQueue.offer() called at: 1594558123030    hash:2091496189 Server recieved: CONFIRMED recieveQueue.take() called at: 1594558123031    hash:2091496189 

The hash verifies that I’m working on the same Queue, and as seen by the Time, recieveQueue.offer(msg) is definitely called before take() and so the Queue should contain a message. But the Program stops at the take() call. No Exceptions were thrown and there is no other point in the code where take() gets called. I waited for like 10 minutes but the take() call never finishes

Add Comment
1 Answer(s)

Made few changes in your program.

Note: Please check in your code Consumer in while loop.

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();         }     }            } } 
Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.