**
阻塞队列(BlockingQueue)
**
什么是阻塞队列(ArrayBlockingQueue);
1,概念
阻塞队列是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会阻塞,而当队列满是,插入元素的线程会阻塞;阻塞队列常用于生产者和消费者的场景,生产者是往队列中添加元素,消费者去队列获取元素。
构造方法:
ArrayBlockingQueue< E e> list=new ArrayBlockingQueue();
因为ArrayBlockingQueue继承了BlockingQueue所以也可以使用多态的方法
BlockingQueue< E e> list=new ArrayBlockingQueue();
添加元素:**put(E e)**如果队列已满,添加的线程会被阻塞,直到队列不满
获取元素返回获取后被删除的元素:**E take()**如果队列已空,获取的线程会被阻塞,直到队列不空
在队列头部获取元素但不删除元素。包括element()和peek()方法,当队列为空时,线程会被阻塞直到它不为空
class A extends Thread{
//生产者线程
private BlockingQueue<String> blockingQueue;
public A(BlockingQueue<String> blockingQueue){
this.blockingQueue=blockingQueue;
}
@Override
public void run() {
String str[]=new String[]{
"one",
"two",
"three"
};
for(int i=0;i<100;i++){
try{
Thread.sleep(1000);
System.out.println("生产者生产资源");
blockingQueue.put(str[i%3]);
}catch (Exception e){
System.out.println("添加完成");
}
}
}
}
class B extends Thread{
//生产者线程
private BlockingQueue<String> blockingQueue;
public B(BlockingQueue<String> blockingQueue){
this.blockingQueue=blockingQueue;
}
@Override
public void run() {
while (true){
try{
Thread.sleep(1000);
String take = blockingQueue.take();
System.out.println(take);
System.out.println("消费者生产资源");
}catch (Exception e){
System.out.println("队列为空");
}
}
}
}
public class Demo01{
public static void main(String[] args) {
BlockingQueue<String> bq=new ArrayBlockingQueue<String>(1);
new A(bq).start();
new A(bq).start();
new A(bq).start();
new B(bq).start();
}
}
ArrayBlockingQueue():基于数组实现的BlockingQueue队列
LinkedBlockingQueue():基于链表实现的BlockingQueue队列