多线程通信经典问题——生产者消费者
2017-03-20 22:17
169 查看
/** * 多线程通信经典案例:生产者消费者 * 多生产者、多消费者 * @author Ranphy * */ class Src{ private String name; private int count=1; private boolean flag=false; public synchronized void set(String name){ while(flag){ //从if改成while是因为当有多个生产者和消费者出现的时候容易出现多个消费者共享一个生产者 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name=name+count; count++; System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name); flag=true; this.notifyAll();//若使用notify()会发生死锁现象 } public synchronized void out(){ while(!flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"---消费者---------"+this.name); flag=false; this.notifyAll(); } } class Product implements Runnable{ private Src r; public Product(Src r) { this.r=r; } @Override public void run() { while(true){ r.set("牛肉"); } } } class Customer implements Runnable{ private Src r; public Customer(Src r) { this.r=r; } @Override public void run() { while(true){ r.out(); } } } public class ProductCustomerDemo { pub 4000 lic static void main(String[] args) { Src r=new Src(); Product pro=new Product(r); Customer cust=new Customer(r); Thread t0=new Thread(pro); Thread t1=new Thread(pro); Thread t2=new Thread(cust); Thread t3=new Thread(cust); t0.start(); t1.start(); t2.start(); t3.start(); } }
在JDK1.5以后将同步和锁封装成了对象,并将操作锁的隐式方式定义到了该对象中,将隐式动作变成了显示动作。即实现lock接口并通过实现类进行创建对象。lock替代了synchronized方法和语句的使用,可以在一个锁上加上多组监视器;condition替代了object监视器wait、notify等方法的使用 ,将监视器方法单独进行封装,可以任意锁进行组合。以便随时可以跟锁进行绑定。
//创建一个锁对象 Lock lock=new ReentrantLock(); //通过已有的锁获取该锁上的监视器对象 //Condition con=lock.newCondition(); //通过已有的锁获取两组监视器,一组监视生产者,一组监视消费者 Condition pro_con=lock.newCondition(); Condition cust_con=lock.newCondition(); public void set(String name){ lock.lock(); try { while(flag){ //从if改成while是因为当有多个生产者和消费者出现的时候容易出现多个消费者共享一个生产者 try { //con.await(); pro_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name=name+count; count++; System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name); flag=true; //con.signalAll();//若使用signal()会发生死锁现象 cust_con.signal();//用来唤醒另一个锁 } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void out(){ lock.lock(); try { while(!flag){ try { cust_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"---消费者-----"+this.name); flag=false; pro_con.signalAll(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } }
相关文章推荐
- java多线程总结六:经典生产者消费者问题实现
- 经典的生产者─消费者问题(一)
- 【读书笔记】linux系统用semaphore来解决经典的生产者-消费者问题
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- 经典进程同步问题 生产者——消费者问题
- 经典进程问题:生产者与消费者
- 经典多线程实例:生产者消费者问题
- java多线程总结六:经典生产者消费者问题实现
- 黑马程序员——多线程操作经典实例:生产者消费者问题
- [Java] Thread-05- 线程同步-生产者与消费者的经典问题
- java多线程总结六:经典生产者消费者问题实现
- 多线程八 生产者消费者经典问题
- 经典线程同步问题(生产者&消费者)
- JAVA多线程经典问题 -- 生产者 消费者
- 经典进程同步问题-生产者与消费者
- 经典线程同步问题(生产者&消费者)--Java实现
- Java经典线程同步问题------生产者与消费者
- java 多线程经典例子——生产者与消费者的问题
- 经典的IPC问题 -- 哲学家就餐问题、读者-写者问题、理发师睡觉问题、生产者-消费者问题详解
- JAVA多线程经典问题 -- 生产者 消费者 同步队列实现方法