JAVA 100道题(22)

22.实现一个生产者-消费者问题,使用Java的线程同步机制。

生产者-消费者问题是一个经典的并发编程问题,其中生产者产生数据(或产品),消费者消费这些数据。在Java中,我们可以使用wait()notify()方法或者BlockingQueue接口来实现线程同步。

以下是使用wait()notify()方法实现的生产者-消费者问题的示例:

 

java复制代码

public class ProducerConsumerExample {
private static final int MAX_SIZE = 10; // 缓冲区大小
private static final Object lock = new Object(); // 锁对象
private static List<Integer> buffer = new ArrayList<>(MAX_SIZE); // 缓冲区
private static int count = 0; // 缓冲区中当前元素的数量
// 生产者线程
static class Producer extends Thread {
public void run() {
while (true) {
synchronized (lock) {
// 等待缓冲区不满
while (count == MAX_SIZE) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产一个产品(这里用随机数表示)
int product = (int) (Math.random() * 100);
buffer.add(product);
count++;
// 通知可能等待的消费者线程
lock.notifyAll();
}
// 休眠一段时间,模拟生产速度
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 消费者线程
static class Consumer extends Thread {
public void run() {
while (true) {
synchronized (lock) {
// 等待缓冲区不空
while (count == 0) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 消费一个产品
int product = buffer.remove(0);
count--;
// 通知可能等待的生产者线程
lock.notifyAll();
}
// 休眠一段时间,模拟消费速度
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
// 创建并启动生产者线程
new Producer().start();
// 创建并启动消费者线程
new Consumer().start();
}
}

在上面的代码中,我们定义了一个Producer类和一个Consumer类,它们分别继承了Thread类并重写了run()方法。生产者会向缓冲区中添加产品,而消费者会从缓冲区中取出产品。我们使用一个共享的lock对象来实现同步,以及wait()notifyAll()方法来协调生产者和消费者之间的操作。

注意,在生产者和消费者的run()方法中,我们使用了一个while循环来检查缓冲区是否满或空,而不是if条件判断。这是因为wait()方法可能会因为其他原因(如interrupt())被唤醒,所以我们需要再次检查条件是否满足。

此外,为了避免死锁和活锁,确保在wait()notify()方法调用前后都持有锁。这是因为在调用wait()方法时,线程会释放锁,而notify()notifyAll()方法调用后,其他线程可能会获取锁并继续执行。

尽管上述示例展示了如何使用基本的线程同步机制实现生产者-消费者问题,但在实际开发中,通常更推荐使用Java并发包中的BlockingQueue接口及其实现类(如ArrayBlockingQueueLinkedBlockingQueue等),因为它们提供了更简洁、更安全的线程同步机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年03月CCF-GESP编程能力等级认证C++编程五级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第1题 唯一分解定理描述的内容是( )? A. 任意整数都可以分解为素数的乘积 B. 每个合数都可以唯一分解为一系列素数的乘积 C. 两个不…

rtthread studio 基于bsp生成代码stm32l475正点原子潘多拉,以及硬件配置

1、基于bsp生成代码 rtthread studio 很强大的一个功能就是可以根据芯片或者bsp 生成驱动代码&#xff0c;而且rtthread内核 已经集成到了代码中&#xff01;&#xff01;只需要关注于如何使用硬件和设备完成我们想要的功能就可以&#xff1b; 它的官网文档也特别详细&#x…

实用有趣的宝藏网站推荐!【第二期】

上次给大家推荐了10个宝藏网站&#xff08;http://t.csdnimg.cn/qcRWY&#xff09;&#xff0c;这次我又来啦&#xff01; 话不多说&#xff0c;直接开始&#xff01; 先收藏&#xff0c;防止以后找不到了&#xff01; 整理不易&#xff0c;顺便把赞留下吧&#xff01; 1. 爱…

江苏开放大学2024年春《市政管理学050011》第一次形考作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题…

代码随想录算法训练营Day55 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离

583. 两个字符串的删除操作 这道题的状态方程比上一题简单一些 初始化如下 class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1));for (int i 0; i < word1…

数学错误总是越走越远,因为对前人一概不敢否定

最近整理了一下我以前对Erds-Turn猜想研究做的分析&#xff0c;得到的结论是&#xff1a;1927年产生的van der Waerden的结果尚未被正确证明&#xff0c;现存几个证明都有问题&#xff0c;特别地[F]的方法中无法证明在那个定义下的度量产生的拓扑里某些闭集是紧致集&#xff08…

2024年数字IC秋招-沐曦-GPU验证-笔试题

文章目录 前言一、选择题1. [多选]在Verilog里面&#xff0c;操作的可能的结果是2. [单选]在Verilog里面,如果想在逻辑中引入延时&#xff0c;可以使用3. [单选]如果X 4b1100,那么以下哪条语句会被执行?4. [多选]在Verilog里面&#xff0c;以下哪些对于操作符的描述是正确的5.…

Linux 基础IO [缓冲区文件系统]

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一.Linux下一切皆文件 二.缓冲…

在线接口文档预言方案

在线接口文档预言方案 要求&#xff1a; ​ 支持自动生成接口文档 ​ 能够支持在线测试(http&#xff0c;websocket) ​ 对代码没有侵入性 一、目前涉及的相关技术收集 sudo apt update #更新数据 sudo apt upgrade #更新软件 sudo apt install openssh-server #下载安装…

数据结构与算法-分治算法

数据结构与算法 数据结构与算法是计算机科学中的两个核心概念&#xff0c;它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式&#xff0c;它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…

14.黑盒测试

黑盒测试、白盒测试考题固定&#xff0c;重视&#xff01;&#xff01;&#xff01; 等价类、边界值、场景法&#xff1b;考察频率高&#xff01;&#xff01;&#xff01; 因果图&#xff0c;偶尔考&#xff1b;要能看懂因果图&#xff0c;结合题干填写缺失的部分内容&#x…

Redis中的客户端(三)

客户端 身份验证 客户端状态的authenticated属性用于记录客户端是否通过了身份验证: typedef struct redisClient {// ...int authenticated;// ... } redisClient;如果authnticated的值为0&#xff0c;那么表示客户端未通过身份验证&#xff1b;如果authenticated的值为1&a…

智慧酒店(二):AI智能分析网关V4视频分析技术在酒店管理中的应用

一、人工智能技术如何应用在酒店管理中&#xff1f; 随着科技的飞速发展&#xff0c;人工智能技术已经逐渐渗透到我们生活的方方面面&#xff0c;其中&#xff0c;酒店管理行业便是其应用的重要领域之一。人工智能技术以其高效、精准的特点&#xff0c;为酒店管理带来了革命性…

Day34:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 四、 搭建平台管理端前端环境 改造登录功能功能测试 权限管理模块-角色管理 环境搭建开发角色管理接口 权限管理模块-用户管理 开发用户管理CURD接口

题目 2894: 肿瘤检测

题目描述: 一张CT扫描的灰度图像可以用一个N*N&#xff08;0 < N < 100&#xff09;的矩阵描述&#xff0c;矩阵上的每个点对应一个灰度值&#xff08;整数&#xff09;&#xff0c;其取值范围是0-255。我们假设给定的图像中有且只有一个肿瘤。在图上监测肿瘤的方法如下…

31-4 命令执行漏洞 - RCE原理

一、定义 RCE(远程命令/代码执行)漏洞是指存在于软件或系统中的安全漏洞,使得攻击者可以通过网络远程执行操作系统命令或者注入恶意代码,从而控制目标系统。 二、漏洞原理 漏洞原理是指RCE漏洞产生的根本原因,通常与不安全的输入验证、错误的配置和不充分的安全措施有关…

修改nuxtjs项目中的浏览器图标步骤

处理步骤&#xff1a; 打开配置页面 使用el-upload 上传图片到后台 后台把图片转为ico&#xff0c;返回图标路径 配置页面修改本页面预览图&#xff0c;点击保存&#xff0c;修改的数据库。 通知nuxt布局页面&#xff0c;修改head节点中的图标属性&#xff0c;…

如何系统得自学python?——7.列表与元组

列表 一、列表的应⽤场景 列表是Python中最常用的数据结构之一&#xff0c;用于存储一组有序的数据。它在各种场景中都有广泛的应用&#xff0c;例如&#xff1a; 存储多个相同类型的数据&#xff0c;如学生成绩、员工工资等。存储不同类型的数据&#xff0c;如图书信息&…

Channel 结合 Select 使用

在Go语言中&#xff0c;channel和select结合使用是一种强大的并发模式。channel允许在不同的goroutine之间安全地传递消息&#xff0c;而select使得goroutine可以同时等待多个通信操作&#xff08;channel操作&#xff09;。 select语句等待多个channel操作中的任意一个完成。…

《VulnHub》Lampião:1

title: 《VulnHub》Lampio&#xff1a;1 date: 2024-03-28 21:37:49 updated: 2024-03-28 21:37:50 categories: WriteUp&#xff1a;Cyber-Range excerpt: 关键技术&#xff1a;主机发现&#xff0c;端口扫描、服务探测、操作系统探测&#xff0c;对开放的端口探测漏洞&#x…