发布网友 发布时间:2022-04-25 12:16
共2个回答
热心网友 时间:2022-04-08 20:12
我这里有一个测试代码,其中可以很明显的看到其中区别
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()都会被阻塞。
}
}
热心网友 时间:2022-04-08 21:30
ConcurrentLinkedQueue 并发链接队列
LinkedBlockingQueue 链接阻塞队列