线程间通信(生产者和消费者案例)

2024-06-21 02:20

本文主要是介绍线程间通信(生产者和消费者案例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、传统的线程间通信的方式

使用

Object:

        synchronized:阻塞锁

        wait():阻塞当前队列

        notifyAll():唤醒所有阻塞队列

package ProduceAndConsumer;/** @Auther:生产者消费者案例1* @Date:2024/6/20* @Description:qinhao* @VERSON:1.8*/public class PACTest {public static void main(String[] args) {Clerk clerk = new Clerk();new Thread(new Product(clerk)).start();new Thread(new Consumer(clerk)).start();}
}class Clerk{private int count = 0;private static final int maxCount = 3;public synchronized void product() throws InterruptedException {if(count < maxCount){Thread.sleep(500);count++;System.out.println(Thread.currentThread().getName() + "生产了一个商品,当前商品有:" + count);notifyAll();}else{System.out.println(Thread.currentThread().getName() + "仓库已满");this.wait();}}public synchronized void consumer() throws InterruptedException {if(count > 0){Thread.sleep(500);count--;System.out.println(Thread.currentThread().getName() + "消费了一个商品,当前商品有:" + count);notifyAll();}else{System.out.println(Thread.currentThread().getName() + "缺货");this.wait();}}
}//生产者
class Product implements Runnable{private Clerk clerk;Product(Clerk clerk){this.clerk = clerk;}@Overridepublic void run() {while(true){try {clerk.product();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}//消费者
class Consumer implements Runnable{private Clerk clerk;Consumer(Clerk clerk){this.clerk = clerk;}@Overridepublic void run() {while(true){try {clerk.consumer();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

二、Condition控制线程通信

使用 :

lock :

        lock():加锁

        unlock():释放锁

condition:

        await():阻塞当前线程

        signalall():唤醒阻塞线程

package ProduceAndConsumer;/** @Auther:勤学好问* @Date:2024/6/20* @Description:qinhao* @VERSON:1.8*/import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class PACTest {public static void main(String[] args) {Clerk clerk = new Clerk();new Thread(new Product(clerk)).start();new Thread(new Consumer(clerk)).start();}
}class Clerk {private int count = 0;private static final int maxCount = 3;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void product() throws InterruptedException {//枷锁lock.lock();//确保锁释放try {if (count < maxCount) {Thread.sleep(500);count++;System.out.println(Thread.currentThread().getName() + "生产了一个商品,当前商品有:" + count);condition.signalAll();} else {System.out.println(Thread.currentThread().getName() + "仓库已满");condition.await();}} finally {lock.unlock();}}public void consumer() throws InterruptedException {//枷锁lock.lock();//确保锁会释放try {if (count > 0) {Thread.sleep(500);count--;System.out.println(Thread.currentThread().getName() + "消费了一个商品,当前商品有:" + count);condition.signalAll();} else {System.out.println(Thread.currentThread().getName() + "缺货");condition.await();}} finally {lock.unlock();}}
}class Product implements Runnable {private Clerk clerk;Product(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {while (true) {try {clerk.product();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class Consumer implements Runnable {private Clerk clerk;Consumer(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {while (true) {try {clerk.consumer();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

这篇关于线程间通信(生产者和消费者案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079943

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之