@wxmimperio The answer you adopted is wrong. ConcurrentLinkedQueue is non-blocking, and LinkedBlockingQueue is blocking. I will give you the codes respectively: as follows:
import java.util.concurrent.LinkedBlockingQueue;
public class TestLinkedBlockingQueue {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
try {
queue.put("a");
queue.put("b");
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
queue.put("c");
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//输出结果:
//a
//b
But look at the non-blocking ConcurrentLinkedQueue
import java.util.concurrent.ConcurrentLinkedQueue;
public class TestConcurrentLinkedQueue {
public static void main(String[] args) {
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
queue.add("a");
queue.add("b");
System.out.println(queue.peek());
queue.remove();
System.out.println(queue.peek());
queue.remove();
System.out.println(queue.peek());
queue.remove();
queue.add("c");
System.out.println(queue.peek());
queue.remove();
}
}
//a
//b
//null
//Exception in thread "main" java.util.NoSuchElementException
// at java.util.AbstractQueue.remove(AbstractQueue.java:117)
// at TestConcurrentLinkedQueue.main(TestConcurrentLinkedQueue.java:14)
Automatic acquisition, no blocking
If it is still blocking, what is the use of this class?
It is recommended to look at the source code and you will know, it is very beneficial
@wxmimperio The answer you adopted is wrong. ConcurrentLinkedQueue is non-blocking, and LinkedBlockingQueue is blocking. I will give you the codes respectively: as follows:
But look at the non-blocking ConcurrentLinkedQueue