本文讲述java自带的阻塞队列BlockingDuque。
队列添加的方法有三种,add,offer,put,队列满后,如果在调用添加方法
add会抛异常,offer会返回boolean,put会阻塞
队列删除的方法有三种,remove,poll,take,队列为空后,如果调用删除方法
remove会抛异常,poll会返回null,take会阻塞
例子:两个线程放数据,一个线程取数据
public class BlockingQueueTest {
public static void main(String[] args) {
final BlockingQueue queue = new ArrayBlockingQueue(3);
for(int i=0;i<2;i++){
new Thread(){
public void run(){
while(true){
try {
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName() + "准备放数据");
queue.put(1);
System.out.println(Thread.currentThread().getName() + "已经放了数据" +
"队列目前有" + queue.size() + "个数据");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
new Thread(){
public void run(){
while(true){
try {
//此处将睡眠时间修改,观察运行效果
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "准备取数据");
queue.take();
System.out.println(Thread.currentThread().getName() + "已经取了" +
"队列目前有" + queue.size() + "个数据");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
执行结果
Thread-2准备取数据
Thread-0准备放数据
Thread-0已经放了数据队列目前有1个数据
Thread-2已经取了队列目前有0个数据
Thread-2准备取数据
Thread-0准备放数据
Thread-0已经放了数据队列目前有0个数据
Thread-2已经取了队列目前有0个数据
Thread-2准备取数据
Thread-1准备放数据
Thread-1已经放了数据队列目前有1个数据
Thread-2已经取了队列目前有0个数据
Thread-2准备取数据
Thread-1准备放数据
Thread-1已经放了数据队列目前有1个数据
Thread-2已经取了队列目前有0个数据
·······