java阻塞队列是一个支持阻塞的插入,移除的队列。
阻塞的插入:向队列中插入元素时,若队满,则队列会阻塞插入的线程。
阻塞的移除:移除队列中的一个元素时,若队空,则队列会阻塞移除的线程。直至队列非空。
从上图中可以看出,阻塞队列的所有实现类有:
所有已知实现类:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
1.ArrayBlockingQueue:数组结构的阻塞队列,按照FIFO(先进先出)原则,对队列元素进行排序。
2.LinkedBlockingQueue:链表结构的阻塞对列,队列默认的最大长度:Integer.MAX_VALUE
3.DelayQueue:支持延时的无界阻塞队列。
4.PriorityBlockingQueue:支持优先级顺序的无界阻塞队列。
阻塞队列不可用时,执行其方法的4种不同处理结果:
阻塞队列实现生产者,消费者模型
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* @author wangpei
* @version 创建时间:2017年4月20日 下午3:06:07 阻塞队列实现生产者,消费者模型
*/
public class ZuSeDuiLie {
public static void main(String[] args) {
BlockingQueue q = new ArrayBlockingQueue(1, true);// 只有一个元素
produce p = new produce(q);
consumer c = new consumer(q);
Thread thread1 = new Thread(p);
Thread thread2 = new Thread(c);
thread1.start();
thread2.start();
}
}
class produce implements Runnable {// 生产者类
private final BlockingQueue q;
public produce(BlockingQueue q) {
this.q = q;
}
@Override
public void run() {
while (true) {
try {
q.put(produce());// 若队列为满时,则会一直阻塞。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public Object produce() {
System.out.println("生产出新零件");
return "new Lingjian";// new LingJian();
}
}
class consumer implements Runnable {
private final BlockingQueue q;
public consumer(BlockingQueue q) {
this.q = q;
}
public void consume(String s) {
System.out.println("我用了该零件");
}
@Override
public void run() {
while (true) {
try {
consume((String) q.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}