Java 阻塞队列练习 (2024.8.12)

embedded/2024/10/19 18:17:08/

        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();}}}
}

 

 


http://www.ppmy.cn/embedded/94568.html

相关文章

8.2.数据库基础技术-数据模型

概念模型是从用户的角度进行建模的&#xff0c;是现实世界到信息世界的第一抽象&#xff0c;是真正的实体-联系模型。关系模型是二维表的形式表示的实体-联系模型&#xff0c;是将实体-联系模型转换而来的&#xff0c;经过开发人员设计的&#xff1b;网状模型表示实体类型及其实…

Unity协程WaitForSeconds在编辑器和WebGL表现不同问题的解决方法参考

最近做的一个效果让下面为了让下面这种图片生成一个翻页效果&#xff08;使用ShaderGraph中的FlipBook节点&#xff09;&#xff0c;我通过携程来实现连续翻页。 先是定义一个Coroutine coroutine null&#xff1b; 然后在一定情况下执行coroutine StartCoroutine(KeepPrevie…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级&#xff0c;从最初的模拟监控到数字监控&#xff0c;再到高清化、网络化监控&#xff0c;直至现在的智能化监控&#xff0c;每一次变革都推动了行业的快速发展。特别是近年来&#xff0c;随着AI、大数据、物联网等技术的…

idm下载速度只有1m IDM下载速度不稳定什么原因 idm下载速度慢解决办法

IDM能够集成到大多数流行的浏览器中&#xff0c;并提供一键下载功能&#xff0c;方便用户快速下载网页中的文件。今天&#xff0c;我们学习IDM下载速度只有1M&#xff0c; IDM下载速度不稳定什么原因的内容。 一、 IDM下载速度只有1M的原因 IDM&#xff08;Internet Download…

英语写作中“存在”exist、in the presence of 的用法

英语写作中“存在”exist不时遇到&#xff0c;有时候可以用in the presence of 替代以丰富英语表达。例如&#xff1a; If there exists effective solutions to this issue, the situation won’t get worse.&#xff08;如果存在有效解决方案&#xff0c;情况不会更糟。&…

linux的wps字体问题解决方法汇总

近期工作变动&#xff0c;主要工作由写代码变成了写各种office文档……所以需要在ubuntu上用wps。但是ubuntu有一些字符和windows是不一样的。wps总是报错缺少字符&#xff0c;且有些课件是需要特定字体的&#xff0c;故而整理一下目前在wps方面的使用方法。 解决linux WPS报错…

简单介绍一下css中transform的内容

在CSS中&#xff0c;transform属性用于对元素进行变换&#xff0c;包括旋转、缩放、倾斜和平移等操作。以下是transform属性中常用的属性&#xff1a; translate&#xff1a;用于元素的平移操作&#xff0c;可以指定元素在X轴和Y轴方向上的平移距离。 rotate&#xff1a;用于元…

LabVIEW中CANopen 读取程序解读

这段程序用于创建 CANopen 接口&#xff0c;并读取 CANopen CAN 帧消息。以下是详细的解读&#xff1a; 左侧部分 node-ID (U8): 指定节点 ID&#xff0c;用于标识 CANopen 网络中的设备。CANopen interface (U32): 指定 CANopen 接口。baud rate (U32): 设置波特率&#xff0…