生产者消费者问题(多线程完整版)
来源:互联网 发布:参不敏 何足以知之 编辑:程序博客网 时间:2024/06/05 10:35
什么也不多说了,很经典的问题,不论是在多线程学习的时候,还是在操作系统课程设计的时候。
//使用jdk1.5的多线程实现方式实现可以同时多生产多消费的功能import java.util.concurrent.locks.*;//描述产品class Clothes{ //产品名称 private String name; //产品价格 private double price; //存放产品的容器 private Clothes[] arr = new Clothes[100]; //创建一把锁 private Lock lock =new ReentrantLock(); //创建和锁绑定的Condition对象,控制生产线程 private Condition pro = lock.newCondition(); //创建和锁绑定的Condition对象,控制消费线程 private Condition con = lock.newCondition(); //生产使用的下标 private int propointer; //消费使用的下标 private int conpointer; //记录产品数量 private int count; public Clothes(){} public Clothes(String name,double price) { this.name = name; this.price = price; } //生产功能 public void produce() { lock.lock(); try { //先判断该不该生产,当容器满的时候不能生产 while(count==arr.length) { try{pro.await();}catch(InterruptedException e){e.printStackTrace();} } arr[propointer]=new Clothes("衬衣",99.99); System.out.println(Thread.currentThread().getName()+"...生产了"+arr[propointer]+"..."+count); count++;//数量加1 if(++propointer==arr.length) propointer=0; con.signal(); } finally { lock.unlock(); } } //消费功能 public void consume() { lock.lock(); try { //先判断该不该消费,当商品数量为0 的时候,不能消费 while(count==0) { try{con.await();}catch(InterruptedException e){e.printStackTrace();} } Clothes yifu = arr[conpointer]; System.out.println(Thread.currentThread().getName()+"...消费了"+yifu); count--; if(++conpointer==arr.length) conpointer=0; pro.signal(); } finally { lock.unlock(); } } public String toString() { return name+","+price; }}class Producer implements Runnable{ private Clothes clo; public Producer(Clothes clo) { this.clo = clo; } public void run() { while(true) { clo.produce(); } }}class Consumer implements Runnable{ private Clothes clo; public Consumer(Clothes clo) { this.clo = clo; } public void run() { while(true) { clo.consume(); } }}class practice7 { public static void main(String[] args) { Clothes clo = new Clothes(); Producer producer = new Producer(clo); Consumer consumer = new Consumer(clo); Thread t1 = new Thread(producer); Thread t2 = new Thread(producer); Thread t3 = new Thread(consumer); Thread t4 = new Thread(consumer); t1.start(); t2.start(); t3.start(); t4.start(); }}
0 0
- 生产者消费者问题(多线程完整版)
- 生产者消费者问题--多线程
- 多线程--生产者消费者问题
- 多线程+生产者、消费者问题
- 多线程生产者消费者问题
- 多线程(生产者-消费者问题)
- 多线程生产者消费者问题
- c++多线程 (生产者消费者问题)
- 多线程问题(生产者和消费者)
- 生产者消费者问题(Java多线程)
- java多线程 生产者消费者问题
- java多线程 生产者 消费者 问题 。。。
- 多线程9:生产者消费者问题
- <MFC多线程> 生产者消费者问题
- linux多线程--生产者消费者问题
- 【多线程】(九)生产者消费者问题
- 多线程之生产者消费者问题
- 多线程之生产者消费者问题
- EL函数库
- 【概念笔记】常用标准类
- warning: non-variable type argument Any in type pattern scala.collection.immutable.Set[Any] (the und
- MongoDB高级查询(二)
- 高中纪中OJ3078. 【备战NOIP2012图论专项模拟试题】无线通讯网
- 生产者消费者问题(多线程完整版)
- 【zzulioj 1919 二分】
- 【jzoj4711】【Binary】【树状数组】
- 易语言 精益/VIP精益模中的普通填表与网页填表的使用
- 链表中环的入口结点
- 【概念笔记】字节型输入输出流
- 算术表达式的语法分析及语义分析程序设计 —— LR分析法、输出三元式
- Django(2)——运用数据库为你的网页添加翻页功能
- poj2385 Apple Catching