多线程下的如何高效安全传输数据。在的Concurrent包中,BlockingQueue在一个方面很好的解决了这个问题。
简介:
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。
JDK7提供了以下7个阻塞队列:
ArrayBlockingQueue :由数组结构组成的有界阻塞队列。
LinkedBlockingQueue :由链表结构组成的有界阻塞队列。
PriorityBlockingQueue :支持优先级排序的无界阻塞队列。
DelayQueue:使用优先级队列实现的无界阻塞队列。
SynchronousQueue:不存储元素的阻塞队列。
LinkedTransferQueue:链表结构组成的无界阻塞队列。
LinkedBlockingDeque:链表结构组成的双向阻塞队列。
阻塞队列提供了下列四种处理方法
使用场景:
从数据结构和方法看出,是不是很像MQ中的生产-消费模式。没错,用它搭建一个生产消费模式很方便,我们来试试吧。
1、先建一个全局的静态BlockQueue对象吧
package org.lochte.cache;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class MQCache {
public static BlockingQueue<String> producerBQ = new LinkedBlockingQueue<String>();
}
2、然后是生产者
package org.lochte.block;
import org.lochte.cache.MQCache;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
public class Prod