阻塞队列(BlockingQueue)
体系
阻塞队列是collection单列集合体系下的一个接口有两个实现类
ArrayBlockingQueue(数组,有界)和LinkedBlockingQueue(链表,无界,最大值未int最大值)
常用方法
put(anObject)将参数放入队列,如果放不下会阻塞
take()取出第一个数据,取不到会阻塞
利用阻塞队列实现等待唤醒机制(其自带锁不用额外添加锁,否则可能会导致死锁)
import java.util.concurrent.ArrayBlockingQueue;
public class Test {
//结束条件
public static int count=10;
public static void main(String[] args) {
ArrayBlockingQueue<String> abq=new ArrayBlockingQueue<>(1);
Cook cook = new Cook(abq);
Foodie foodie = new Foodie(abq);
cook.start();
foodie.start();
}
}
import java.util.concurrent.ArrayBlockingQueue;
public class Cook extends Thread {
ArrayBlockingQueue<String> abq;
public Cook(ArrayBlockingQueue<String> abq) {
this.abq = abq;
}
@Override
public void run() {
while (true) {
try {
abq.put("面条");
if (Test.count == 0) {
System.out.println("你已经吃完");
break;
}
System.out.println("做了一碗面条");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.concurrent.ArrayBlockingQueue;
public class Foodie extends Thread {
ArrayBlockingQueue<String> abq;
public Foodie(ArrayBlockingQueue<String> abq) {
this.abq = abq;
}
@Override
public void run() {
while (true) {
try {
String take = abq.take();
System.out.println(take);
Test.count--;
if (Test.count == 0) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}