阻塞队列常用于生产者和消费者的情况
可以实现等待唤醒
常规的等待唤醒机制就是加了锁以及在适当位置增加wait(等待) notify(唤醒) 或是用sleep(计算时间等待)
用阻塞队列更加方便
但是需要注意的是生产者和消费者必须使用同一个队列 否则存放和 拿到的数据不是同一个
下面给出代码实例
首先创建一个线程cook
import java.util.concurrent.ArrayBlockingQueue;
public class cook extends Thread{
ArrayBlockingQueue<String> quee;
//这里设置一个quee 不要单独创建 否则俩线程不在一个队列
public void setQuee(ArrayBlockingQueue<String> quee) {
this.quee = quee;
}
//为quee设置set方法 下面重写方法
@Override
public void run(){
while (true){
try {
quee.put("面条");
System.out.println("厨师做好了");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
再创建一个类 foodie 大概内容与cook相似
import java.util.concurrent.ArrayBlockingQueue;
public class foodioe extends Thread{
ArrayBlockingQueue<String> quee;
public void setQuee(ArrayBlockingQueue<String> quee) {
this.quee = quee;
}
@Override
public void run(){
while (true){
try {
String take = quee.take();
System.out.println(take);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
创建测试类
import java.util.concurrent.ArrayBlockingQueue;
public class zusedemo {
//生产者和消费者必须使用同一个阻塞队列
//创建阻塞队列对象
public static void main(String[] args) {
ArrayBlockingQueue<String> quee=new ArrayBlockingQueue<>(10);
//创建阻塞队列
cook c=new cook();
foodioe f=new foodioe();
//创建线程
c.setQuee(quee);
f.setQuee(quee);
//两个加到同一个队列
c.start();
f.start();
/*
* 开启线程
*
* 代码跑起来后会看到有些杂乱
* 这是因为打印的语句没有放进锁里而已
* 代码是成功的 成功实现了厨子做一碗饭 队列有位置就放 没有就等待 放进队列 顾客吃一碗 没有就等待
* 这个blockingQueue 内部自带锁的 并且有等待唤醒机制
*
* */
}
}