使用jdk1.5的多线程 lock condition 实现方式实现 生产者消费者问题
2016-08-17 19:51
501 查看
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 Demo6 { 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(); } }
相关文章推荐
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- java使用多线程实现生产者消费者问题
- 生产者/消费者问题的多种Java实现方式
- 生产者/消费者问题的多种Java实现方式
- 使用Lock来实现生产者和消费者问题
- Thinking in Java---线程通信+三种方式实现生产者消费者问题
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5新特性-Lock
- 生产者/消费者问题的多种Java实现方式
- 生产者/消费者问题的多种Java实现方式
- (转)生产者/消费者问题的多种Java实现方式 (待整理)
- 生产者/消费者问题的多种Java实现方式 (待整理)
- 生产者/消费者问题的多种Java实现方式--转
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
- 生产者/消费者问题的多种Java实现方式
- 生产者/消费者问题的多种Java实现方式
- 生产者/消费者问题的多种Java实现方式
- 多线程经典问题之生产者消费者问题的JAVA实现
- linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题
- 生产者/消费者问题的多种Java实现方式
- Linux下用条件变量实现多线程间生产者与消费者问题