java多线程 实现生产者和消费者问题


import java.util.ArrayList;
import java.util.List;

/**
 * @author 宁
 *生产者消费者问题:生产者生产的东西不能超出规定的最大生产量,
 *超过最大生产量时将暂停生产,等待消费者消费。
 *消费者当购买生产者的东西时,当购买的东西库存达到0时会停止购买,等待生产者生产。
 *二者是一种动态平衡状态,也就是说生产者在生产期间消费者有消费并且没有达到最大生产量就可以一直生产,
 *并不是生产者要生产到最大产量才允许消费者开始消费。
 */
public class Xiancheng {
	public static void main(String[] args) {
		List list = new ArrayList();
		// 两个线程公用一个表对象
		Thread t1 = new Thread(new Shengchan(list));
		Thread t2 = new Thread(new Xiaofei(list));
		t1.start();
		t2.start();
	}

}
//假如生产者最多只能生产一个物品超过一个将停止生产等待消费者消费来模拟一下这个问题(可以生产多个)
class Shengchan implements Runnable {
	List list;

	public Shengchan(List list) {
		super();
		this.list = list;
	}

	@Override
	public void run() {
		int i = 0;
		// 对于生产者消费者进行100次观察其效果
		while (i < 100) {
			// 生产者占用锁
			synchronized (list) {
				// 此时表示生产者已经生产了一个产品了
				if (list.size() > 0) {
					try {
//						Thread.sleep(1000);
						// 释放锁,进行等待
						list.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				// 执行到这一步表示list.size() = 0,此时生产者要进行生产了
				Object obj = new Object();
				list.add(obj);
				System.out.println("生产者生产" + obj + "第" + i + "次");
				// 唤醒所有等待
				list.notifyAll();
			}
			i++;
		}

	}
}

class Xiaofei implements Runnable {
	List list;

	public Xiaofei(List list) {
		super();
		this.list = list;
	}

	@Override
	public void run() {
		int i = 0;
		while (i < 100) {
			// 消费者占用锁
			synchronized (list) {
				if (list.size() == 0) {
					try {
						// 表示消费者已经消费完了释放锁进行等待
						list.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				// 没有进入if语句表明list.size() != 0 消费者可以消费
				// 对表内的元素进行删除返回的是删除的元素
				Object obj = list.remove(0);
				System.out.println("消费者消费" + obj + "第" + i + "次");
				// 唤醒所有等待
				list.notifyAll();
			}
			// 进行技术
			i++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值