当前位置: 首页 > news >正文

线程协作

生产者消费者模式

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

  • 对于生产者,没有生产产品之前,要通知消费者等待.而生产了产品之后,又需要马上通知消费者消费
  • 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费,
  • 在生产者消费者问题中,仅有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.jsqmd.com/news/30107/

相关文章:

  • 2025 光伏/通讯/低压/高压/工程/剩余/电线/废旧/二手/大卷/电缆回收推荐榜:龙耀再生以合规高效领跑,四家企业彰显资源循环实力
  • 2025广告策划/营销策划/电商/餐饮/食品/化妆品/美妆/护肤品/建材/家居/品牌策划领域公司/机构推荐榜:物心策划以定制化破局,三家企业凭实战力脱颖而出
  • 关于 Adobe Flash Player,这些重要信息你需要知道!
  • 2025年11月加工型辣椒种子厂家排名前十: 加工型辣椒种子深入探究
  • 微算法科技(NASDAQ MLGO):DPoS驱动区块链治理与DAO机制融合,共筑Web3.0坚实基石
  • 【LTDC】LTDC 驱动的接口层与 LCD 显示的应用驱动层
  • 2025年11月线椒种子厂家前十强榜:探索线椒种子厂家实力
  • 【LangChain Model IO 02】
  • rk3568时钟驱动
  • 2025年11月色素椒种子厂家前十排名:江苏恒润领跑市场
  • Paint.net中处理文本的缺点
  • # 20232321 2024-2025-1 《网络与系统攻防技术》实验4实验报告
  • 探究cv2.GaussianBlur中ksize和sigma对于效果的影响
  • 2025年11月螺丝椒种子厂家推荐榜:镇江市镇研种业螺丝椒种子夺冠
  • Calico从VXLAN模式切换到IPIP模式
  • 2025年11月色素椒种子品牌前十排名:镇研种业领跑
  • 【GitHub每日速递 20251103】Claude Cookbooks:一站式掌握Claude开发秘籍,解锁AI无限可能!
  • AE/PR插件-Continuum 2026 v19.0.0 CE BCC视觉特效和转场插件一键安装版
  • 2025年线椒种子品牌综合评测:镇研种业领跑行业十大供应商
  • 2025 年膜结构厂家最新推荐品牌排行榜:涵盖充电棚停车棚等多品类,精选五大优质企业权威解析景观棚/收费棚/体育棚/污水池棚/门头出入口棚/推拉棚公司推荐
  • 2025年酸洗钝化服务标杆厂家最新推荐:威海立森环保,专注不锈钢酸洗钝化/设备酸洗钝化/机械酸洗钝化/压力容器酸洗钝化/表面处理新标准
  • 2025 年上海留学中介品牌最新推荐排行榜:聚焦优质机构,助力学子精准选靠谱留学服务机构澳洲留学/香港留学/匈牙利留学/马来西亚留学/加拿大留学/出国留学公司推荐
  • 让“照片查看器显示,并且能打开多种格式
  • 【IEEE出版|EI检索】2025年能源、电力与电气技术国际学术会议(CEPET 2025)
  • linux mint 22.2安装记录
  • Calico VXLAN 每一台节点服务器上都会开启并监听UDP 4789
  • 吱吱企业即时通讯软件:以安全为底座,打造企业协同办公新生态
  • 2025年家用电子计重秤厂商权威推荐:珠宝电子秤/数显电子天平秤/圆形厨房电子秤源头厂家精选
  • 2025年玻纤格栅厂家权威推荐榜单:双向经编玻纤土工格栅/玻璃纤维土工格栅/自粘玻纤格栅源头厂家精选
  • 2025年桁架机械臂直销厂家权威推荐:重载桁架机械手/桁架机器人/码垛桁架机械手源头厂家精选