关于JAVA队列的申明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JAVA队列的申明相关的知识,希望对你有一定的参考价值。

求教各位大牛 JAVA中队列如何申明 我看网上有些是 Queue<Integer> q = new LinkedBlockingQueue<Integer>(); 有些是Queue<String> queue = new ConcurrentLinkedQueue<String>(); 这后面的ConcurrentLinkedQueue和LinkedBlockingQueue是怎么定义的?有什么区别

我这里有一个测试代码,其中可以很明显的看到其中区别
public class QueueTest
public static void main(String[] args)
BlockingQueue<String> blockQueue = new LinkedBlockingQueue<String>();//new SynchronousQueue<String>()
class QueuePuter implements Runnable
private BlockingQueue queue;
public QueuePuter(BlockingQueue queue)
this.queue = queue;


public void run()
try
for(int i=0;i<10;i++)
queue.put("Item "+i);
System.out.println("Put >>> Item "+i);

catch (InterruptedException e)
e.printStackTrace();




class QueueTaker implements Runnable
private BlockingQueue queue;
public QueueTaker(BlockingQueue queue)
this.queue = queue;

public void run()
try
Object obj = null;
while((obj = queue.take())!=null)
System.out.println("Take >>> "+obj);

catch (InterruptedException e)
e.printStackTrace();




new Thread(new QueueTaker(blockQueue)).start();
//如果是 SynchronousQueue 把这行注释掉 程序会阻塞,说明如果没有线程执行take()操作则所有线程的put()操作都会被阻塞。
//如果是 LinkedBlockingQueue 把这行注释掉 程序会正常退出,说明就算没有take()操作的线程,所有线程的put()操作也可以把所有数据写入管道,而且管道容量可以不限。

new Thread(new QueuePuter(blockQueue)).start();
//如果是 SynchronousQueue 把这行注释掉 程序会阻塞, 说明如果没有线程执行put()操作则所有线程take()都会被阻塞。而且take()操作执行了几次,put()操作也只能执行几次,说明管道是没有容量的,同时只能操作一个元素。
//如果是 LinkedBlockingQueue 把这行注释掉 程序会阻塞, 说明如果管道是空的并且没有线程执行put()操作则所有线程take()都会被阻塞。


参考技术A ConcurrentLinkedQueue 并发链接队列
LinkedBlockingQueue 链接阻塞队列

以上是关于关于JAVA队列的申明的主要内容,如果未能解决你的问题,请参考以下文章

关于Java集合类库中的几种常用队列

关于Java线程池详解

Java SpringBoot集成RabbitMq实战和总结

Java SpringBoot集成RabbitMq实战和总结

Java中的队列

Java面试18|关于进程与线程