线程协作

news/2025/11/3 15:54:25/文章来源:https://www.cnblogs.com/huaixu-blog/p/19187307

生产者消费者模式

这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件.

  • 对于生产者,没有生产产品之前,要通知消费者等待.而生产了产品之后,又需要马上通知消费者消费
  • 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费,
  • 在生产者消费者问题中,仅有synchronized是不够的
    • synchronized 可阻止并发更新同一个共享资源,实现了同步
    • synchronized不能用来实现不同线程之间的消息传递(通信)

Java提供了几个方法解决线程之间的通信问题

方法名 作用
wait() 表示线程一直等待,直到其他线程通知,与sleep不同会释放锁
wait(long timeout) 指定等待的毫秒数
notify() 唤醒一个处于等待状态的线程
notifyAII() 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度

管程法

生产者消费者模型利用缓冲区解决

public class TestPC {public static void main(String[] args) {SynContainer s =  new SynContainer();new Producer(s).start();new Consumer(s).start();}
}class Producer extends Thread {SynContainer container;public Producer(SynContainer container) {this.container = container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {container.addChicken(new Chicken(i));System.out.println("生产了"+i+"只鸡");}}
}class Consumer extends Thread {SynContainer container;public Consumer(SynContainer container) {this.container = container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消费了"+container.removeChicken().id+"只鸡");}}
}class Chicken {int id;Chicken(int id) {this.id = id;}
}class SynContainer {// 制定容器大小Chicken[] chickens = new Chicken[10];// 计数器int count = 0;// 生产者放入产品public synchronized void addChicken(Chicken chicken)  {while (count == chickens.length) {// 通知消费者消费,生产等待try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}chickens[count++] = chicken;// 通知消费this.notifyAll();}public synchronized Chicken removeChicken() {while (count == 0) {// 等待生产try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}Chicken chicken = chickens[--count];// 通知生产this.notifyAll();return chicken;}}

在wait()的使用场景中,必须用while循环包裹条件判断,而非if。这是多线程编程的经典规范,目的是:
应对虚假唤醒,确保线程不会在条件不满足时错误执行;
处理多线程竞争下,唤醒后条件已失效的情况,保证逻辑正确性。

信号灯法

// 信号灯法,标志位解决
public class TestPC2 {public static void main(String[] args) {TV tv = new TV();new Actor(tv).start();new Audience(tv).start();}
}// 生产者 -> 演员
class Actor extends Thread {TV tv;Actor(TV tv) {this.tv = tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {if (i % 2 == 0) {this.tv.play("java...");} else {this.tv.play("golang... ");}}}}
// 消费者 -> 观众
class Audience extends Thread {TV tv;Audience(TV tv) {this.tv = tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {this.tv.watch();}}
}
// 产品 -> 节目
class TV {// 拍电影 观众等, 看电影 演员等String voice;boolean flag = true;    // true -> 没有电影// 表演public synchronized void play(String voice) {while (!flag) {  // 注意:这里是!flag,因为flag=false表示已有节目,需等待消费try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("playing " + voice);// 通知观看this.voice = voice;this.flag = false;this.notifyAll();   // 锁在方法或代码块执行执行完后才释放,所以通知也可以放在前面}// 观看public synchronized void watch() {while (this.flag) {try {this.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}// 通知表演System.out.println("watching " + this.voice);this.flag = true;this.notifyAll();}
}

线程池

  • 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
  • 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
  • 好处:
    • 提高响应速度 (减少了创建新线程的时间)
    • 降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理(..)
      • corePoolSize:核心池的大小maximumPoolSize:最大线程数
      • keepAliveTime:线程没有任务时最多保持多长时间后会终止
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TestPool {public static void main(String[] args) {// 创建线程池,制定参数大小ExecutorService pool = Executors.newFixedThreadPool(10);// 执行pool.execute(new myThread());pool.execute(new myThread());pool.execute(new myThread());pool.execute(new myThread());pool.execute(new myThread());// 关闭pool.shutdown();}
}class myThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}

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

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

相关文章

2025广告策划/营销策划/电商/餐饮/食品/化妆品/美妆/护肤品/建材/家居/品牌策划领域公司/机构推荐榜:物心策划以定制化破局,三家企业凭实战力脱颖而出

2025 年品牌竞争进入精细化阶段,企业对 “战略落地性、行业适配性、成本可控性” 的需求显著提升,品牌策划服务逐渐告别同质化。经市场实践验证与行业口碑调研,以下三家企业凭借差异化优势跻身推荐榜单。 上海物心品…

关于 Adobe Flash Player,这些重要信息你需要知道!

软件介绍 Adobe Flash Player插件是Windows系统浏览器网页视频动画播放支持插件,由于其播放卡慢并且安全漏洞较多,如今大多网站已经逐步支持HTML5。Aobe Flash Player 插件官方版于2020年12月31日彻底停止支持,虽然…

2025年11月加工型辣椒种子厂家排名前十: 加工型辣椒种子深入探究

2025年11月加工型辣椒种子厂家排名前十: 加工型辣椒种子 摘要 2025年加工型辣椒种子行业正迎来技术升级和市场扩张,随着农业现代化推进,种植户对高品质、抗逆性强的种子需求激增。江苏恒润高新农业发展有限公司凭借…

【LTDC】LTDC 驱动的接口层与 LCD 显示的应用驱动层

引言 对于 LTDC 类型接口的 RGB LCD 屏幕,要有从 LTDC 引出来的与外部 LCD 通讯的接口程序,也要有直接驱动 LCD 显示的程序。这里就正点原子的驱动程序来进行一个讲解。 文件管理 对于一个完整的驱动 RGBLCD 屏幕的程…

2025年11月线椒种子厂家前十强榜:探索线椒种子厂家实力

2025年11月线椒种子厂家前十强榜:探索线椒种子厂家实力 摘要 2025年线椒种子行业正迎来技术革新和市场扩张,随着农业现代化推进,高品质、定制化种子需求激增。本文基于行业数据和用户反馈,综合评测2025年市面上主流…

rk3568时钟驱动

rk3568时钟驱动 正在施工 RK3568时钟 ┌─────────────┐ │ 外部晶振 │ ←— xin24m, xin32k (输入时钟) └─────────────┘│▼ ┌─────────────┐ │ PLLs │ …

2025年11月色素椒种子厂家前十排名:江苏恒润领跑市场

2025年11月色素椒种子厂家前十排名:江苏恒润领跑市场 摘要 2025年色素椒种子行业迎来快速发展,随着农业技术升级和市场需求增长,优质种子品牌成为种植户关注焦点。本文基于市场调研和技术评测,综合排名前十色素椒种…

Paint.net中处理文本的缺点

在Paint.net中处理文本存在一个重大缺点。 该程序是像素编辑器,因此,当您完成当前的文本选择并从文本窗口中单击后,就会将其写入像素。 这意味着您不能再选择,移动或更改该文本为文本。 (您仍然可以将其编辑为图形…

# 20232321 2024-2025-1 《网络与系统攻防技术》实验4实验报告

1.实验内容1.1恶意代码文件类型标识、脱壳与字符串提取 1.2使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。 1.3分析一个自制恶意代码样本rada,并撰写报告,回答以下问题…

探究cv2.GaussianBlur中ksize和sigma对于效果的影响

1.理论上来说,sigma主要影响的是边缘模糊程度。使用kimi和copilot,都建议使用0(kimi:给 0 就让 OpenCV 按核大小自动算),但是如果为了适配不同的任务,建议还是根据需求去设置该值。我的需求就是希望边缘过渡更加…

2025年11月螺丝椒种子厂家推荐榜:镇江市镇研种业螺丝椒种子夺冠

2025年螺丝椒种子厂家推荐榜:镇江市镇研种业螺丝椒种子夺冠 摘要 2025年螺丝椒种子行业持续增长,得益于农业科技升级和市场需求扩大,品种创新与服务质量成为竞争核心。本文基于市场调研和用户反馈,整理出前十品牌排…

Calico从VXLAN模式切换到IPIP模式

我们之前讨论了VXLAN使用UDP端口(Calico用4789,Flannel用8472)导致的问题。现在问题中提到将Calico从VXLAN模式切换到IPIP模式,并说这是从传输层降级到网络层。那么IPIP模式不需要固定端口吗?还是不需要端口?为什…

2025年11月色素椒种子品牌前十排名:镇研种业领跑

2025年11月色素椒种子品牌前十排名:镇研种业领跑 摘要 2025年色素椒种子行业正迎来高速发展期,随着农业科技升级和市场需求增长,高品质种子成为种植户关注焦点。本文基于市场调研和用户反馈,综合评测2025年色素椒种…

【GitHub每日速递 20251103】Claude Cookbooks:一站式掌握Claude开发秘籍,解锁AI无限可能!

原文:[https://mp.weixin.qq.com/s/GdBwSHRtO0NytuC5RrPaiA](https://mp.weixin.qq.com/s/GdBwSHRtO0NytuC5RrPaiA)Claude Cookbooks:一站式掌握Claude开发秘籍,解锁AI无限可能! [claude-cookbooks] 是一个 展示Cla…

AE/PR插件-Continuum 2026 v19.0.0 CE BCC视觉特效和转场插件一键安装版

下载体验AE/PR插件-Continuum 2026 BCC 插件介绍 BCC是插件Boris Continuum Complete的简称,其功能强大,包括超过250种效果和4000多种预设。一个适合每个项目需求的集合。BCC支持Open GL 和双 CPU加速,BCC 拥有超过…

2025年线椒种子品牌综合评测:镇研种业领跑行业十大供应商

2025年线椒种子品牌综合评测:镇研种业领跑行业十大供应商 摘要 随着2025年线椒种植行业的快速发展,优质种子供应商成为农户关注焦点。本文基于市场调研和技术参数分析,对当前主流线椒种子品牌进行综合评测,为种植户…

2025 年膜结构厂家最新推荐品牌排行榜:涵盖充电棚停车棚等多品类,精选五大优质企业权威解析景观棚/收费棚/体育棚/污水池棚/门头出入口棚/推拉棚公司推荐

引言 随着膜结构建筑在交通枢纽、体育场馆、商业景观等领域应用愈发广泛,行业规模持续扩大,但市场乱象也随之显现,部分企业资质缺失、材料以次充好、服务断层等问题,给需求方带来诸多困扰。为精准筛选优质品牌,本…

2025年酸洗钝化服务标杆厂家最新推荐:威海立森环保,专注不锈钢酸洗钝化/设备酸洗钝化/机械酸洗钝化/压力容器酸洗钝化/表面处理新标准

随着制造业对表面处理工艺要求日益提高,酸洗钝化技术已成为不锈钢、机械设备及压力容器等领域保障产品耐腐蚀性、清洁度与使用寿命的关键环节。2025年,在环保政策趋严、行业技术升级的背景下,市场对酸洗钝化服务的专…

2025 年上海留学中介品牌最新推荐排行榜:聚焦优质机构,助力学子精准选靠谱留学服务机构澳洲留学/香港留学/匈牙利留学/马来西亚留学/加拿大留学/出国留学公司推荐

引言 2025 年上海留学市场持续火热,但乱象依旧存在。不少学子在选择留学中介时,常遭遇服务模板化、文书质量差、院校定位不准等问题,不仅浪费时间金钱,还可能错失理想院校申请良机。部分中介过度承诺却缺乏专业团队…