当用LinkedBlockingQueue的take()方法获取队列信息时
一旦队列为空,则进入阻塞状态
再往队列里put()元素,take()方法会自动获取新加入元素,还是始终保持阻塞状态?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
自动获取,不会阻塞了
如果还是阻塞,这个类还有什么用?
建议看看源码,就知道了,很有好处的
@wxmimperio 你采纳的答案是错误的。ConcurrentLinkedQueue是不阻塞的,LinkedBlockingQueue是阻塞的。分别给你上代码:如下:
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
但是你再看非阻塞的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)
自动获取,不会阻塞了
如果还是阻塞,这个类还有什么用?
建议看看源码,就知道了,很有好处的
@wxmimperio 你采纳的答案是错误的。ConcurrentLinkedQueue是不阻塞的,LinkedBlockingQueue是阻塞的。分别给你上代码:如下:
但是你再看非阻塞的ConcurrentLinkedQueue