- LinkedBlockingQueue
可以不初始化容量,如果没有指定容量,那么默认容量为Integer.MAX_VALUE(此时需要注意当消费者崩溃或者消费不及时,如果生产者队列一直生产数据到队列,那么有可能会耗光资源,因为队列容量是MAX_VALUE); - ArrayBlockingQueue
必须初始化队列容量,当队列满或者队列空的时候,队列外被block的put线程或者take线程,可以选择是否采取公平锁的等候机制,即当队列有空间或者队列有值的时候,先到的线程优先处理,默认情况下不采用公平锁机制,即选择随机处理; - PriorityBlockingQueue
可以对队列的元素进行排序,通过指定comparator
ArrayBlockingQueue
- 当队列里面没有值,如果执行take操作,队列会一直blocking,直到有值进去队列,然后从对立里面拿走值
- 当队列满的时候,如果执行put操作,队列会一直blocking,直到有值被拿出队列有空间,然后将该值放入队尾。
package com.troy.concurrent.queue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
/**
* ArrayBlockingQueue
* 当队列里面没有值,如果执行take操作,队列会一直blocking,直到有值进去队列,然后从对立里面拿走值
* 当队列满的时候,如果执行put操作,队列会一直blocking,直到有值被拿出队列有空间,然后将该值放入队尾
*/
public class QueueRunner_ArrayBlockingQueue {
List list = new ArrayList();
//里面有基于lock的condition实现
ArrayBlockingQueue queue = new ArrayBlockingQueue(1);
public static void main(String[] args) throws Exception {
QueueRunner_ArrayBlockingQueue runner = new QueueRunner_ArrayBlockingQueue();
//代码段展示了ArrayBlockQueue的示例
try {
Thread.sleep(300);
System.out.println("start to take value...");
//程序会一直block在这里,直到队列里面有值,因为ArrayBlockingQueue里面实现了对锁的condition的控制
System.out.println(runner.queue.take());
new Thread(runner.new ComeIn()).start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class ComeIn implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
try {
queue.put("value" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
输出结果可以看到程序以一直blocking在take(),put线程无法执行
start to take value...