使用Lock锁机制实现 多线程的 多生产 多消费 模式。
2017-08-20 11:48
579 查看
今天学习了·,多线程的生产者和消费者模式,自己就写了一个多生产 多消费的例子,我感觉这个例子可以优化,想法就是 对 run 方法进行了同步 就可以不用对Product类进行lock和unlock了,但是尝试了很久都没成功,如有大神帮忙看看代码,小弟感激不尽。
package cn.sdut.threaddemo; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使用Lock锁机制 实现 多生产 多消费 * * @author zxc * */ class Product { private String name;// 产品名称 private int num;// 产品编号 private int count = 0;// 产品数量 private int procount = 0;// 生产产品存储数组的下标 private int conCount = 0;// 消费产品的存储数组的下标 private Product[] arr = new Product[100];// 储存产品的数组 private final Lock lock = new ReentrantLock();// 同步 private final Condition con = lock.newCondition();// 加锁 private final Condition pro = lock.newCondition();// 加锁 public Product() { } public Product(String name, int num) { super(); this.name = name; this.num = num; } public void setAttribute(String name, int num) { lock.lock(); try { while (count == arr.length) { try { pro.await();// 生产线程停止 } catch (InterruptedException e) { e.printStackTrace(); } } arr[procount] = new Product(name, num); System.out.println(Thread.currentThread().getName()+"生产了编号为" + arr[procount].num + "的" + arr[procount].name + " 库存量:" + (++count));// 库存加1 procount++;// 生产产品下标加1 if (procount == arr.length) {// 如果 下标到达临界值 下标从0开始 procount = 0; } con.signalAll();// 又生产出产品了 唤醒消费线程 } finally { lock.unlock(); } } public void printAttribute() { lock.lock(); try { while (count == 0) { try { con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } Product p = arr[conCount]; System.out.println(Thread.currentThread().getName()+"消费了编号为" + p.num + "的" + p.name + " 库存量:" + (--count));// 产品数量减1 conCount++;// 消费下标加1 因为你不能老是取第一个吧 消费完第一个消费第二个 if (conCount == arr.length) { conCount = 0; } pro.signalAll(); } finally { lock.unlock(); } } } //生产 class producer implements Runnable { private Product product = null; private int count = 0; public producer(Product product) { this.product = product; } @Override public void run() { while(true){ synchronized (this) {//由于要给 衣服添加编号 此方法可避免下面图片的情况 if(++count>500){ break; } product.setAttribute("衣服", count); } } } } //消费 class Consumer implements Runnable { private Product product = null; private int count = 0; public Consumer(Product product) { this.product = product; } @Override public void run() { while(true) { synchronized (this) { if(++count>500){ break; } product.printAttribute(); } } } } // 测试类 public class ThreadDemo05 { public static void main(String[] args) { Product product = new Product();// 建立共享 producer in = new producer(product); Consumer out = new Consumer(product); Thread t1 = new Thread(in); Thread t2 = new Thread(out); Thread t3 = new Thread(in); Thread t4 = new Thread(out); Thread t5 = new Thread(in); Thread t6= new Thread(out); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); } }
相关文章推荐
- 多线程初探之使用Lock实现生产-消费模式
- 使用Condition实现多线程之间调用(生产消费模式)
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 通过pthread_mutex_lock和pthread_cond_wait实现生产消费模式,并且生产一次消费一次
- java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 使用C#的泛型队列Queue实现生产消费模式
- 多线程 : 使用Lock 和 Condition 实现线程间互斥与通信
- java使用BlockingQueue实现生产消费者模式
- GCD 实现生产-消费 模式
- 收藏——CodeProject - 使用特性(attributes)和激活机制来实现工厂模式
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- 在C++中使用事件回调机制(通过Observer模式、函数指针等实现)
- CodeProject - 使用特性(attributes)和激活机制来实现工厂模式
- ActiveMQ使用线程池实现消息的生产与消费 .
- java中使用阻塞队列实现生产这与消费这之间的关系
- CodeProject - 使用特性(attributes)和激活机制来实现工厂模式
- Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
- Linux 多线程等待超时机制的实现:pthread_mutex_lock/pthread_cond_signal/pthread_mutex_unlock
- Java多线程实例->生产消费模式