java多线程二
来源:互联网 发布:python 方括号 编辑:程序博客网 时间:2024/06/06 03:32
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。
前面叙述生产消费者模型,仓库中存在单一产品的问题,
* 多线程生产者消费者模型
* 主要讲解线程同步问题,类Object中的wait,notify和notifyAll方法以及Synchronized关键字的使用
*
* 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。对于此模型,应该明确一下几点:
* 1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
* 2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
* 3、当消费者发现仓储没产品可消费时候会通知生产者生产。
* 4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
前面叙述生产消费者模型,仓库中存在单一产品的问题,
* 多线程生产者消费者模型
* 主要讲解线程同步问题,类Object中的wait,notify和notifyAll方法以及Synchronized关键字的使用
*
* 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。对于此模型,应该明确一下几点:
* 1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
* 2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
* 3、当消费者发现仓储没产品可消费时候会通知生产者生产。
* 4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
* 此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。这是非常重要的。
public class Pc {public static void main(String[] args) {Godown godown = new Godown(50);new Thread(new Produce(10, godown), "produce1").start();new Thread(new Consume(godown, 20), "custom1").start();new Thread(new Consume(godown, 20), "custom2").start();new Thread(new Consume(godown, 20), "custom3").start();new Thread(new Consume(godown, 20), "custom4").start();new Thread(new Produce(10, godown), "produce2").start();new Thread(new Produce(10, godown), "produce3").start();new Thread(new Produce(10, godown), "produce4").start();new Thread(new Produce(10, godown), "produce5").start();new Thread(new Produce(10, godown), "produce6").start();}}class Consume implements Runnable{private Godown godown;private int num ; public Consume(Godown godown , int num){this.godown = godown;this.num=num;}@Overridepublic void run() {godown.consume(num);}}class Produce implements Runnable{private Godown godown ;private int num ; public Produce(int num , Godown godown){this.godown = godown;this.num = num;}@Overridepublic void run() {godown.produce(num);}}class Godown{private static final int MAX_SIZE = 100;private int curnum ; public Godown() {}public Godown(int curnum){this.curnum = curnum;}public synchronized void produce(int num){while(curnum+num > MAX_SIZE){try {System.out.println(Thread.currentThread().getName()+" 生产数量:"+num+"+库存:"+curnum+">最大容量,produce线程wait");wait();System.out.println(Thread.currentThread().getName()+" 生产线程被唤醒,继续运行。");} catch (InterruptedException e) {e.printStackTrace();}}curnum+=num;System.out.println(Thread.currentThread().getName()+"生产了:"+num+"个,目前产品数量:"+curnum);notifyAll();}public synchronized void consume(int num){while(num>curnum){try {System.out.println(Thread.currentThread().getName()+" 消费数量:"+num+" +库存"+curnum+" 超出库存最大容量,custom等待");wait();System.out.println(Thread.currentThread().getName()+"消费线程被唤醒");} catch (InterruptedException e) {e.printStackTrace();}}curnum-=num;System.out.println(Thread.currentThread().getName()+"消费了:"+num+"个,目前产品数量为:"+curnum);notifyAll();}}
produce1生产了:10个,目前产品数量:60custom1消费了:20个,目前产品数量为:40custom2消费了:20个,目前产品数量为:20custom3消费了:20个,目前产品数量为:0custom4 消费数量:20 +库存0 超出库存最大容量,custom等待produce2生产了:10个,目前产品数量:10custom4消费线程被唤醒custom4 消费数量:20 +库存10 超出库存最大容量,custom等待produce3生产了:10个,目前产品数量:20custom4消费线程被唤醒custom4消费了:20个,目前产品数量为:0produce4生产了:10个,目前产品数量:10produce5生产了:10个,目前产品数量:20produce6生产了:10个,目前产品数量:30
</pre><pre name="code" class="java">运行流程
当custom4进行消费时,发现curnum=0,custom4进入线程池中等待,等待生产者进行生产,
当produce2和produce3生产出满足消费的数量时,custom4被唤醒并进行消费。
...................................
0 0
- Java多线程(二)
- java多线程(二)
- java多线程总结<二>
- Java----多线程详解(二)
- JAVA多线程基础(二)
- java基础----多线程(二)
- java 多线程实例二
- java 多线程开发二
- java中的多线程(二)
- Java--多线程(二)
- java多线程(二)
- JAVA多线程(二)
- Java多线程详解(二)
- JAVA多线程(二)
- java多线程二
- Java多线程练习二
- java多线程二
- Java多线程总结(二)
- STL中的sort函数
- Video---HTML5视频video
- 解决Cannot change version of project facet Dynamic web module to 3.0
- 3种SAT数学解题方法介绍
- Windows Server2012 虚拟机复制及故障转移(Part3)
- java多线程二
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
- Windows下Eclipse中免Cygwin的NDK(JNI)配置及Demo调试
- linux 两次 connect()
- 陈怡暖:今将开启为期两天美联储决议会议
- Html5 Viewport学习
- imx6sx-sdb.dtb imx6sx-sdb.dts 设备树 (d:\swwork\solo\linux-3.14.28\arch\arm\boot\dts)
- Appium基于安卓的各种FindElement的控件定位方法实践和建议
- Android性能调优