使用Lock锁机制实现 多线程的 多生产 多消费 模式。

本文通过使用Lock锁机制实现多生产多消费模式,探讨如何优化生产者和消费者模型中的线程同步问题。作者分享了一个具体实例,展示了如何利用条件变量控制生产和消费线程的交替执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值