BlockingQueueExercise1
java">package BlockingQueueExercise20240812;import java.util.concurrent.ArrayBlockingQueue;public class BlockingQueueExercise1 {public static void main(String[] args) throws InterruptedException {// 阻塞队列// 队列有大量的继承结构,其中常见的是BlockingQueue,其是一个接口,需要用其实现类// ArrayBlockingQueue// 其底层是数组,有界// LinkedBlockingQueue// 其底层是链表,理论上有界,为int的最大值,实际上无界(硬件不支持这么大的队列)// BlockingQueue中的核心方法// put(Object obj) 将参数放入队列,若无法放入(队列已满),则会陷入阻塞// take() 取出队列中的(先进先出)第一个数据,若取不到(队列为空),则会陷入阻塞// 创建阻塞队列的对象,容量为 1// 构造方法// ArrayBlockingQueue(int capacity) 创建一个大小为capacity的ArrayBlockQueueArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<>(2);// 存储元素arrayBlockingQueue.put("烧花鸭");arrayBlockingQueue.put("烧雏鸡");// 取元素System.out.println(arrayBlockingQueue.take());System.out.println(arrayBlockingQueue.take());// 取不到会阻塞,所以说下面的代码不会执行,会一直阻塞在此处System.out.println("程序结束了");// 假如阻塞队列容量不足,但又往里面放东西,则也会阻塞}
}
BlockingQueueExercise2
java">package BlockingQueueExercise20240812;import java.util.concurrent.ArrayBlockingQueue;public class BlockingQueueExercise2 {public static void main(String[] args) {// 阻塞队列实现等待唤醒机制// 需求:/* 生产者类(Cooker):实现Runnable接口,重写run()方法,设置线程任务1.构造方法中接收一个阻塞队列对象2.在run方法中循环向阻塞队列中添加汉堡包3.打印添加结果消费者类(Foodie):实现Runnable接口,重写run()方法,设置线程任务1.构造方法中接收一个阻塞队列对象2.在run方法中循环获取阻塞队列中的汉堡包3.打印获取结果测试类(Demo):里面有main方法,main方法中的代码步骤如下创建阻塞队列对象创建生产者线程和消费者线程对象,构造方法中传入阻塞队列对象分别开启两个线程 */ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1); // 队列容量为1,确保交替操作Cook cook = new Cook(queue);Foodie foodie = new Foodie(queue);Thread cookThread = new Thread(cook, "厨师");Thread foodieThread = new Thread(foodie, "顾客");cookThread.start();foodieThread.start();}
}
Cook
java">package BlockingQueueExercise20240812;import java.util.concurrent.ArrayBlockingQueue;public class Cook implements Runnable {private ArrayBlockingQueue<String> bd;public Cook(ArrayBlockingQueue<String> bd) {this.bd = bd;}
// 生产者步骤:
// 1,判断桌子上是否有汉堡包
// 如果有就等待,如果没有才生产。
// 2,把汉堡包放在桌子上。
// 3,叫醒等待的消费者开吃。@Overridepublic void run() {while (true) {try {bd.put("汉堡包");System.out.println("厨师放入一个汉堡包");} catch (InterruptedException e) {e.printStackTrace();}}}
}
Foodie
java">package BlockingQueueExercise20240812;import java.util.concurrent.ArrayBlockingQueue;public class Foodie implements Runnable {private ArrayBlockingQueue<String> bd;public Foodie(ArrayBlockingQueue<String> bd) {this.bd = bd;}@Overridepublic void run() {
// 1,判断桌子上是否有汉堡包。
// 2,如果没有就等待。
// 3,如果有就开吃
// 4,吃完之后,桌子上的汉堡包就没有了
// 叫醒等待的生产者继续生产
// 汉堡包的总数量减一//套路://1. while(true)死循环//2. synchronized 锁,锁对象要唯一//3. 判断,共享数据是否结束. 结束//4. 判断,共享数据是否结束. 没有结束while (true) {try {String take = bd.take();System.out.println("吃货将" + take + "拿出来吃了");} catch (InterruptedException e) {e.printStackTrace();}}}
}