Java多线程____生产者与消费者模型

1.仓库类__:入库和出库的集合   有生产和出货方法

package com.test.thread;

import java.util.LinkedList;
/**
 * @author Administrator
 * 仓库类
 */
public class Storage {
	//存储集合
	private  LinkedList<Object> list = new LinkedList<Object>();
	
	public void ruku(int num) {
		synchronized (list) {
			while (list.size() + num > 100) {
				try {
					list.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= num; ++i) {
				list.add(new Object());
			}
			System.out.println("生产完成量为:" + num + "现仓库有数量为:" + list.size());
			list.notifyAll();
		}
	}
	
	public void chuku(int num) {
		synchronized (list) {
			while (list.size() < num) {
				try {
					list.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= num; ++i) {
				list.remove();
			}
			System.out.println("取货量为:" + num + "仓库剩余量为:" + list.size());
			list.notifyAll();
		}
	}

}
2.生产者

package com.test.thread;
/**
 * @author Administrator
 * 生产类
 */
public class Producer extends Thread {

	//每次生产的数量默认为仓库最大容量
	private int num=100;
	//建立仓库
	private Storage storage;
	
	// get/set方法
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Storage getStorage() {
		return storage;
	}
	public void setStorage(Storage storage) {
		this.storage = storage;
	}

//构造函数,设置仓库
	public Producer(Storage storage) {
		this.storage = storage;
	}
//线程run方法执行生产方法
	public void produce(int num) {
		storage.ruku(num);
	}
	
	@Override
    public void run() {
    	produce(num);
    }
}

3.消费者

package com.test.thread;
/**
 * @author Administrator
 * 消费类
 */
public class Consumer extends Thread {
	
	// 每次消费的产品数量
	private int num;
	// 所在放置的仓库
	private Storage storage;
	// 构造函数,设置仓库
	public Consumer(Storage storage) {
		this.storage = storage;
	}

	// get/set方法
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Storage getStorage() {
		return storage;
	}
	public void setStorage(Storage storage) {
		this.storage = storage;
	}
	//先run方法执行消费方法
	public void consume(int num) {
		storage.chuku(num);
	}
	
	@Override
    public void run() {
		consume(num);
	}
}
4.测试类

package com.test.thread;

import java.util.Random;

public class Test {
	public static void main(String[] args) {
//仓库
		Storage storage = new Storage();
//生产类
		Producer p1 = new Producer(storage);
//客户类		
		Consumer c1 = new Consumer(storage);
		Consumer c2 = new Consumer(storage);
		Consumer c3 = new Consumer(storage);
//要生产的数量
			p1.setNum(100);
//消费的数量随机的
			c1.setNum(new Random().nextInt(20));
			c2.setNum(new Random().nextInt(20));
			c3.setNum(new Random().nextInt(20));
//线程开始执行
			p1.start();

			c1.start();
			c2.start();
			c3.start();

	}
	
}

//运行结果




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值