今天学习了·,多线程的生产者和消费者模式,自己就写了一个多生产 多消费的例子,我感觉这个例子可以优化,想法就是 对 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();
}
}