您的位置:首页 > 其它

使用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();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐