多线程经典——生产者消费者问题(加锁版)
2017-10-21 18:30
387 查看
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * 生产者,消费者 * Lock接口:出现替代了同步代码块或者同步函数,将同步的隐式锁操作变成现实锁操作, * 同时更加灵活,可以一个锁上加多组监视器。 * lock()获取锁 * unlock()释放锁,通常定义在finally代码块中 * Condition接口:出现替代了Object中的wait notify notifyAll方法 * 将这些监视器方法单独进行了封装,变成Condition监视器对象。可以任意锁进行组合 * await() signal() signalAll() * * */ class Resrouce { private String name; private int count=1; private boolean flag=false; //创建一个锁对象 Lock lock=new ReentrantLock(); //通过已有的锁获取该锁上的监视器对象 // Condition con=lock.newCondition(); //通过已有的梭获取两组监视器,一组监视生产者,一组监视消费者 Condition producer_con=lock.newCondition(); Condition consumer_con=lock.newCondition(); public void set(String name) { lock.lock(); try { while(flag) try{producer_con.await();} catch(InterruptedException e) {} this.name=name+count; count++; System.out.println(Thread.currentThread().getName()+"..生产者."+this.name); flag=true; consumer_con.signal(); } finally { lock.unlock(); } } public void out() { lock.lock(); try { while(!flag) try{consumer_con.await();} catch(InterruptedException e) {} System.out.println(Thread.currentThread().getName()+"..消费者............."+this.name); flag=false; producer_con.signal(); } finally { lock.unlock(); } } } class Producer implements Runnable { private Resrouce r; Producer(Resrouce r) { this.r=r; } public void run() { while(true) { r.set("烤鸭"); } } } class Consumer implements Runnable { private Resrouce r; Consumer(Resrouce r) { this.r=r; } public void run() { while(true) { r.out(); } } } public class Demo { public static void main(String[] args) { Resrouce r=new Resrouce(); Producer pro=new Producer(r); Consumer con=new Consumer(r); Thread t1=new Thread(pro); Thread t2=new Thread(con); Thread t3=new Thread(pro); Thread t4=new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); } }
相关文章推荐
- 多线程经典——生产者消费者问题(未加锁版)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 多线程之经典生产者消费者问题
- java多线程总结六:经典生产者消费者问题实现
- java多线程总结六:经典生产者消费者问题实现
- java多线程之生产者消费者经典问题
- 多线程经典问题-生产者与消费者
- 生产者与消费者以及多个容器的多线程问题(经典 集合了老师,同学以及自己的想法)
- 经典多线程实例:生产者消费者问题
- C# 多线程编程 经典模型 生产者和消费者问题
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- java多线程总结六:经典生产者消费者问题实现
- java多线程经典的生产者消费者问题
- java多线程之生产者和消费者经典问题案例
- java 多线程经典例子——生产者与消费者的问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- 多线程经典案例——生产者/消费者问题的Java实现与详解