/*  资源类 */
class ShareValue {private int total;//判断对象是否为空private boolean isEmpty=true;//判断对象是否已满private boolean isFull=true;public ShareValue(int total) {this.total = total;if(total>0) isEmpty=false;if(total<1000) isFull=false;}/** synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,* 否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。* 这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态* (因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。* */synchronized void putValue(int value){//取得当前线程名String name=Thread.currentThread().getName();while(isFull){display("Full ! ["+name+"] waites.");try {this.wait();} catch (InterruptedException e) {System.out.println(e);}}total+=value;if(total>1000){isFull=true;}display(name+",put: "+value+",old value: "+(total-value)+",now value"+total);isEmpty=false;//通知所有的等待线程notifyAll();}synchronized int getValue(int value){String  name=Thread.currentThread().getName();while(isEmpty || total<value){display("Empty or not enough! ["+name+"] waits.");            try {//进入等待状态this.wait();} catch (InterruptedException e) {System.out.println(e);}}display(name+" get: "+value+",old value:"+total+",now value :"+(total-value));if(total-value>=0){total-=value;}if(total==0){isEmpty=true;}if(total<1000){isFull=false;}//通知所有等待的线程notifyAll();return value;}int getNowTotal(){return total;}private void display(String string) {System.out.println(string);}
}/*  生产者类  */
class Producer extends Thread {// 共享的ShareValue对象ShareValue share;// 要增加的值int value;public Producer(String name, ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run() {//同步share对象 ,直到当前代码块运行完毕后,share的对象锁才会释放synchronized (share) {try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.putValue(value);}}
}/*消费者类*/
class Consumer extends Thread{//共享的ShareValue对象ShareValue share;//要减少的值int value;public Consumer(String name,ShareValue share, int value) {super(name);this.share = share;this.value = value;}public void run(){  //同步share对象,直到当前代码运行完毕后,share的对象锁才会释放synchronized (share) {try {sleep(100);} catch (InterruptedException e) {System.out.println(e);}share.getValue(value);}}
} /*  测试主类  */
public class TestDemo {public static void main(String[] args) {ShareValue share=new ShareValue(0);Producer producer1=new Producer("producer1", share, 100);Consumer consumer=new Consumer("consumer", share, 300);Producer producer2=new Producer("producer2",share,950);Producer producer3=new Producer("producer3",share,50);
//      Producer producer4=new Producer("producer4",share,50);
//      Producer producer5=new Producer("producer5",share,50);producer1.start();consumer.start();producer2.start();producer3.start();
//      producer4.start();
//      producer5.start();}}

java线程“生产/消费”模型2相关推荐

  1. java 线程“生产/消费”模型1

    /*资源类*/ public class ShareValue {private int total;public ShareValue(int total){this.total=total;}// ...

  2. Java实现生产消费模型的5种方式

    ** 前言 ** 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储 ...

  3. 生产-消费模型之阻塞队列的源码分析

    文章目录 前言 阻塞队列API 存放元素 boolean add(E e) boolean offer(E e) boolean offer(E e, long timeout, TimeUnit u ...

  4. java生产消费模型代码实现_生产者-消费者模型的Java实现

    本文转自:http://tanlan.iteye.com/blog/1158154 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个 ...

  5. java 运动的大球吃小球_JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型...

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/ 前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先 ...

  6. java线程的内存模型_java多线程内存模型

    java多线程内存模型: 可见性 要实现共享变量的可见性,必须保证两点: 1.线程修改后的共享变量能够及时从工作内存刷新到主内存中: 2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存 ...

  7. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

    1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...

  8. 23.生产与消费模型

    实际生活中,需要操作共享的某个资源(水池),但是对这个共享资源的操作方式不同(部分是注水[生产].部分是抽水[消费]).把这种现象我们可以称为生产和消费模型. 生产:它可以采用部分线程进行模拟.多个线 ...

  9. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

最新文章

  1. 有界阻塞队列ArrayBlockingQueue和无界阻塞队列LinkedBlockingQueue
  2. 一起学nRF51xx 20 -  移植SDK蓝牙例程
  3. 淘宝网消费者年维权成功金额达1.69亿
  4. CCNA学习笔记12---黄毛丫头篇(访问控制列表)
  5. 模板匹配(Match Template)
  6. python系统关键字_python基础之常用关键字总结
  7. python小白逆袭大神课程心得_python小白逆袭大神(深度学习7日训练营)——心得体会...
  8. Dubbo(一)之简介
  9. 前端学习(3133):react-hello-react之高阶函数
  10. 微处理器硬件喂狗_硬件基础:微控制器到底是什么?
  11. 数字逻辑要不要认真学_认真认真
  12. 【机房收费系统C#版】——导出Excel
  13. 训练自己的数据_YOLOv3训练自己的数据集(以口罩检测数据集为例)
  14. 【云安全课程】云平台使用安全
  15. ps5手柄连接android,PS5游戏手柄甚至可以兼容安卓设备?这一次有的玩了
  16. Ai斗地主智能出牌算法
  17. 盲盒识别装置-2022TI杯10月联赛D题
  18. i春秋 - Exploit-Exercises: Nebula - level06
  19. 【GPL和LGPL】【VPlayer不开源】【其他开源的基本都仅是ffmpeg修改部分】
  20. 人人网2017暑假实习生招聘-一面

热门文章

  1. Java接口long类型精度丢失,解决前后端交互Long类型精度丢失问题
  2. php生成txt文件_php 批量生成html,txt文件的实现代码
  3. Moment.js日期处理库的使用
  4. 在BurpSuite中安装Jython环境
  5. 小程序确定取消弹窗_小程序开发之弹出框
  6. jQuery的on绑定click和直接绑定click区别
  7. 小程序修改数组中对象的某个值或者修改对象值
  8. 如何在 vue-cli v3.0 中使用 SCSS/SASS
  9. [PALAPALA] 无题 - 外来的和尚会念经
  10. WordPress Event Easy Calendar插件多个跨站请求伪造漏洞