/*** 线程通信的应用:经典例题:生产者/消费者问题** 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,* 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员* 会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品* 了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。** 分析:* 1. 是否是多线程问题?是,生产者线程,消费者线程* 2. 是否有共享数据?是,店员(或产品)* 3. 如何解决线程的安全问题?同步机制,有三种方法* 4. 是否涉及线程的通信?是*/
class Clerk{private int productCount = 0;//生产产品public synchronized void produceProduct() {if(productCount < 20){productCount++;System.out.println(Thread.currentThread().getName() + ":开始生产第" + productCount + "个产品");notify();}else{//等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}//消费产品public synchronized void consumeProduct() {if(productCount > 0){System.out.println(Thread.currentThread().getName() + ":开始消费第" + productCount + "个产品");productCount--;notify();}else{//等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}class Producer extends Thread{//生产者private Clerk clerk;public Producer(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {System.out.println(getName() + ":开始生产产品.....");while(true){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}clerk.produceProduct();}}
}class Consumer extends Thread{//消费者private Clerk clerk;public Consumer(Clerk clerk) {this.clerk = clerk;}@Overridepublic void run() {System.out.println(getName() + ":开始消费产品.....");while(true){try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}clerk.consumeProduct();}}
}public class ProductTest {public static void main(String[] args) {Clerk clerk = new Clerk();Producer p1 = new Producer(clerk);p1.setName("生产者1");Consumer c1 = new Consumer(clerk);c1.setName("消费者1");Consumer c2 = new Consumer(clerk);c2.setName("消费者2");p1.start();c1.start();c2.start();}
}

代码思路:
1.创建生产者和消费者(因为它们都是线程所以要继承Thread,这里用的时同步机制的第一种方法)以及他们的共享数据店员(Clerk)和产品数量(productCount)
2.分别创建带clerk的构造器
3.重写run()方法
4.创建生产者和消费者以及它们的共用类clerk的对象
5.调用这两个对象的start()
6.完善clerk中生产产品和消费产品的同步方法,别忘记加上wait()和notify()!

在打代码时我出错了的以及需要注意的地方:在使用wait时忘了加synchronized,wait()和notify()需要配套使用

多线程-线程通信:生产者消费者例题相关推荐

  1. 13-多线程01 实现多线程 线程同步 生产者消费者

    1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...

  2. java多线程通信_Java多线程-线程通信

    原标题:Java多线程-线程通信 通信的方式 要想实现多个线程之间的协同,如:线程执行先后顺序.获取某个线程执行的结果等等.涉及到线程之间的相互通信,分为下面四类: 文件共享 网络共享 共享变量 JD ...

  3. 【线程】——生产者消费者模型

    多线程经典示例--生产者消费者模型 所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题.通俗的讲,就是生产者在不断的生产,消费者也在不断的消费,可是消费者消费的产品是生产者生产的, ...

  4. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  5. Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)

    终止线程 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用. 本文向大家介绍使用interrupt方法中断线程. 使用interrupt方法来终 ...

  6. Java线程实现生产者—消费者模式

    在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...

  7. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  8. Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)

    转自:https://blog.csdn.net/qq_35995514/article/details/91128585 1 学习内容 notifyAll 生产者.消费者经典范式 线程休息室 wai ...

  9. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

最新文章

  1. stdthread(7)并发unique_lock
  2. dll文件复制和替换不了_重新编译mono——Android动态更新dll
  3. Akka Types of dispatchers
  4. eclipse 不能将maven jar包导入到tomcat中问题
  5. ✳编程求当n≤100时,n!的准确值
  6. Facebook 约十亿美元收购脑机技术公司,助攻AR研发;苹果宣布新款 Mac Pro 在美国生产;谷歌称已实现量子霸权…...
  7. L_01 网络字节顺序
  8. 2天玩转单反相机引领时尚娱乐新生活
  9. 自由软件、开源软件、免费软件之间的区别
  10. 微信消息实现自动推送--方式一 成功啦 进来学
  11. 【转】货币的未来取决于打破关于货币历史的虚构谎言
  12. 高数笔记(二):极限的运算法则,极限存在准则,两个重要极限,无穷小的比较
  13. 4412——Linux驱动入门01
  14. 第二章 搭建Android开发环境
  15. wow Warlock shushia PVP DZ
  16. Redis系列:Redis持久化机制与Redis事务
  17. 编写一个程序,计算学生的总分和平均成绩(一)
  18. QT遇到“常量中有换行符”的问题
  19. dataframe的两列转换成字典的key和value
  20. 《细说PHP》第二版--读书笔记

热门文章

  1. 简单的脚本在linux下将坚果云下同步的文件转移到zotero
  2. 中国肺功能仪市场研究与预测报告(2022版)
  3. Linux cal命令
  4. 在CentOS8上安装win10虚拟机
  5. 前端转安卓开发!作为一名程序员我不忘初心,进阶学习资料!
  6. ubuntu 定时 执行 python 脚本
  7. 产品-如何评价“抬杠”-来自知乎
  8. console线登录交换机
  9. ERP项目6大实施风险及如何规避!
  10. java计算机毕业设计ssm泸定中学宿舍管理系统设计g93gd(附源码、数据库)