java多线程实现生产者与消费者
来源:互联网 发布:短信变号软件 编辑:程序博客网 时间:2024/06/05 02:34
只是自己的理解有错误还请指出:
工厂类:
public class MyFactory { private int foodNum = 0; public int getFoodNum() { return foodNum; } public void setFoodNum(int foodNum) { this.foodNum = foodNum; } public void consume(){ try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } this.foodNum--; } public void produce(){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } this.foodNum++; }}消费者类:
public class ConsumerThread implements Runnable { private MyFactory myFactory =null; public ConsumerThread(MyFactory factory){ this.myFactory = factory; } @Override public void run() { for (int i = 0; i < 20; i++) { synchronized (this.myFactory){ try{ Thread.sleep(10); while(this.myFactory.getFoodNum() <= 0){ System.out.println("仓库里面没有库存了,请通知生产者去生产"); this.myFactory.wait(); //放弃工厂的使用权:锁 } myFactory.consume(); myFactory.notifyAll(); //消费完了之后通知那些阻塞的生产者线程可以生产了 System.out.println("消费完了之后还有"+myFactory.getFoodNum()+"个零件"); }catch (InterruptedException e){ e.printStackTrace(); } } } }}生产者类:
public class ProducerThread implements Runnable { private MyFactory myFactory = null; public ProducerThread (MyFactory factory){ this.myFactory = factory; } @Override public void run() { for (int i = 0; i < 20; i++) { synchronized (this.myFactory){ try{ Thread.sleep(100); while (this.myFactory.getFoodNum() >= 10){//库存满了 System.out.println("仓库库存为10(满额),进入等待状态,等待消费者取消费"); this.myFactory.wait(); } myFactory.produce(); System.out.println("生产完了之后有"+myFactory.getFoodNum()+"个零件"); myFactory.notifyAll();//生产完了知乎通知那些阻塞的消费者线程可以消费了 }catch (InterruptedException e){ e.printStackTrace(); } } } }}测试类:
/** * 测试使用wait和notify来模拟生产者与消费者 * 其中用到了很多sleep来模拟不确定因素 * Created by amanicspater on 2017/7/26. */public class Main { public static void main(String[] args) { MyFactory myFactory = new MyFactory(); Thread producerthread = new Thread(new ProducerThread(myFactory)); Thread consumerthread = new Thread(new ConsumerThread(myFactory)); producerthread.start(); consumerthread.start(); }}
打印结果:
生产完了之后有1个零件生产完了之后有2个零件生产完了之后有3个零件生产完了之后有4个零件生产完了之后有5个零件生产完了之后有6个零件生产完了之后有7个零件生产完了之后有8个零件生产完了之后有9个零件生产完了之后有10个零件仓库库存为10(满额),进入等待状态,等待消费者取消费消费完了之后还有9个零件消费完了之后还有8个零件消费完了之后还有7个零件消费完了之后还有6个零件消费完了之后还有5个零件消费完了之后还有4个零件消费完了之后还有3个零件消费完了之后还有2个零件消费完了之后还有1个零件消费完了之后还有0个零件仓库里面没有库存了,请通知生产者去生产生产完了之后有1个零件生产完了之后有2个零件生产完了之后有3个零件生产完了之后有4个零件生产完了之后有5个零件生产完了之后有6个零件生产完了之后有7个零件生产完了之后有8个零件生产完了之后有9个零件生产完了之后有10个零件消费完了之后还有9个零件消费完了之后还有8个零件消费完了之后还有7个零件消费完了之后还有6个零件消费完了之后还有5个零件消费完了之后还有4个零件消费完了之后还有3个零件消费完了之后还有2个零件消费完了之后还有1个零件消费完了之后还有0个零件
之前有一次随机答应的很混乱的打印结果,之后就打不出来了 很随机的。
阅读全文
0 0
- java多线程实现生产者与消费者
- 生产者消费者Java多线程实现
- Java多线程实现,生产者消费者
- java多线程 生产者与消费者
- 【Java多线程】-生产者与消费者
- JAVA - 多线程 - 生产者与消费者
- Java多线程-生产者与消费者
- 用JAVA实现多线程(生产者与消费者问题)
- 生产者与消费者问题(java多线程实现)
- java多线程实现生产者与消费者---经典问题
- Java多线程之生产者与消费者实现(1p1c)
- java多线程--ReentrantLock实现生产者与消费者模式
- Java 实现生产者与消费者
- Java实现生产者与消费者
- java实现生产者与消费者
- java实现生产者与消费者
- java实现生产者与消费者
- Boost多线程实现生产者与消费者问题
- ubuntu16.10安装VirtualBox虚拟机
- 堆和栈的区别
- jquery利用ajax URL传参处理特殊字符串#%
- Java入门基础之【循环结构】8
- [Leetcode] 317. Shortest Distance from All Buildings 解题报告
- java多线程实现生产者与消费者
- hadoop 问题汇总
- ctests cahis
- Error parsing XML: unbound prefix on XXX解决办法
- AES加解密算法二
- Android studio 项目构建五|合并多个清单文件
- java.lang.IllegalArgumentException: node to traverse cannot be null!
- c/c++编译原理
- 一个软链接导致的系统崩塌