Java之多线程模拟:多生产者-多消费者

测试入口:

 

 

/**
 *	多线程程序:模拟2个生产者生产产品,3个消费者消费产品;2个生产者不停的生产商品,3个消费者不停的消费产品
 * @author Smilexs
 *
 */
public class Test {

	public static void main(String[] args) {
		
		Resoures r = new Resoures();
		
		Thread pro1= new Thread(new Producer(r),"生成者1号");
		Thread pro2= new Thread(new Producer(r),"生成者2号");
		
		Thread con1= new Thread(new Consumer(r),"消费者1号");
		Thread con2= new Thread(new Consumer(r),"消费者2号");
		Thread con3= new Thread(new Consumer(r),"消费者3号");
		
		pro1.start();
		pro2.start();
		
		con1.start();
		con2.start();
		con3.start();
	}

}


涉及源码:

 

 

public class Resoures {
	
	private int count=1;//生产次数
	private Lock lock = new ReentrantLock();//对象锁,保证线程安全
	private Condition con = lock.newCondition();//锁的监视器
	private boolean flag= false;
	public static boolean isStop = false;
	public static int produceCount = 300;//总的生成量
	
	public int getCount(){
		return count;
	}
	/**
	 * 生产
	 * @param productName
	 */
	public void produce(String productName){
		lock.lock();//获得对象锁
		while(flag){
			//flag = true:通知消费
			try {
				con.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//flag= flase时:生产
		System.out.println(Thread.currentThread().getName() +":生产了第"+count+"台"+productName);
		count++;
		flag = true;
		con.signalAll();
		lock.unlock();
	}
	/**
	 * 消费
	 */
	public void consume(){
		lock.lock();
		while(!flag){
			try {
				//flag=flase,通知生产
				con.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//flag=true,消费
		flag=false;
		System.out.println(Thread.currentThread().getName() +":购买了第"+(count-1)+"台");//生产后,count为下一台的记号
		con.signalAll();
		lock.unlock();
	}
	
	
}

 

 

 

 

 

 

/**
 * 生成者
 */
public class Producer implements Runnable{
	private Resoures resoures = null;//同一份资源
	
	public Producer(Resoures resoures) {
		this.resoures = resoures;
	}
	
	@Override
	public void run() {
		while(resoures.getCount()< resoures.produceCount ){
			resoures.produce("iphone 6s");
		}
		resoures.isStop = true;
	}

}

 

/**
 * 消费者
 */
public class Consumer implements Runnable{
	private Resoures resoures = null;
	
	public Consumer(Resoures resoures ) {
		this.resoures =resoures;
	}
	
	
	@Override
	public void run() {
		while(!resoures.isStop){
			resoures.consume();
		}
	}

}

 

 

结果展示:
。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值