线程间通信-多生产者多消费者(Lock版本)
2016-07-14 21:38
288 查看
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ProducerConsumerDemo2{ public static void main(String[] args){ Resource resource = new Resource(); //多个生产者,多个消费者 new Thread(new Producer(resource)).start(); new Thread(new Producer(resource)).start(); new Thread(new Consumer(resource)).start(); new Thread(new Consumer(resource)).start(); } } class Resource { private String name; private int count = 1; private boolean flag = false; private Lock lock = new ReentrantLock(); private Condition condition_pro = lock.newCondition(); private Condition condition_con = lock.newCondition(); public void set(String name) throws InterruptedException{ lock.lock(); try{ while(flag) condition_pro.await(); this.name = name + "--" +count++; System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name); flag = true; condition_con.signal(); }finally { lock.unlock(); } } public void out() throws InterruptedException{ lock.lock(); try{ while(!flag) condition_con.await(); System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name); flag = false; condition_pro.signal(); }finally { lock.unlock(); } } } class Producer implements Runnable{ private Resource r; Producer(Resource r){ this.r = r; } public void run(){ while(true){ try{ r.set("+商品+"); }catch (InterruptedException e){ } } } } class Consumer implements Runnable{ private Resource r; Consumer(Resource r){ this.r = r; } public void run(){ while(true){ try{ r.out(); }catch (InterruptedException e){ } } } }
相关文章推荐
- 用vbscript实现启用 Caps Lock (大写)键
- C#中lock死锁实例教程
- C#中实现线程同步lock关键字的用法详解
- 解析使用C# lock同时访问共享数据
- [Oracle] 浅谈Lock与Latch
- mysql下普通用户备份数据库时无lock tables权限的解决方法
- C#中的lock、Monitor、Mutex学习笔记
- C#中lock用法详解
- Python多线程同步Lock、RLock、Semaphore、Event实例
- Java多线程编程之Lock用法实例
- Python多线程编程(四):使用Lock互斥锁
- Python多进程同步Lock、Semaphore、Event实例
- HAZELCAST 客户端命令 可用于简单调试
- E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource ....
- E: Could not get lock /var/cache/apt/archives/lock (resource unavailable)
- 虚拟机vmx打不开Failed to lock the file的解决方法
- Oracle 常见问题以及解决方案
- Another app is currently holding the yum lock; waiting for it to exit…
- Oracle 锁管理
- Oracle Latch 管理