天天看点

生产者与消费者模式Java多线程中的生产者与消费者模式

Java多线程中的生产者与消费者模式

创建Factory类(工厂类)

public class Factory {
	//商品数量
	private int num = 0;
	//商品可允许最大值
	private static final int NUM_MAX = 100;
	//同步生产方法
	public synchronized void product() throws InterruptedException {
		//获取线程名字
		String name = Thread.currentThread().getName();
		//判断是否小于最大值
		if (num<NUM_MAX) {
		//持续生产
			num++;
			System.out.println(name+"生产了一个商品,还剩下"+num+"个商品");
		}else {
			System.out.println("仓库已满"+name+"无需生产");
			//休眠当前线程
			this.wait();
			//唤醒销售者线程
			this.notify();
		}
	}
	//同步销售方法
	public synchronized void sell() throws InterruptedException {
	//获取当前线程名称
		String name = Thread.currentThread().getName();
		//判断商品数量是否大于0
		if (num>0) {
		//持续销售商品
			num--;
			System.out.println(name+"销售了一个商品,还剩下"+num+"个商品");
		}else {
			System.out.println("仓库已空"+name+"无需销售");
			//唤醒生产者线程
			this.notify();
			//睡眠当前线程
			this.wait();
		}
	}

}
           

创建 ProductRunnable 类(生产者类)

public class ProductRunnable implements Runnable{
	//工厂属性
	private Factory factory;
	//构造函数
	public ProductRunnable(Factory factory) {
		super();
		this.factory = factory;
	}

	@Override
	public void run() {
		//创建死循环
		while(true) {
			try {
				//休眠100ms
				Thread.sleep(100);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			try {
				//调用工厂中的生产方法;
				factory.product();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
           

创建 SellRunnable类(销售者类)

public class SellRunnable implements Runnable{
	//工厂属性
	private Factory factory;
	//构造函数
	public SellRunnable(Factory factory) {
		super();
		this.factory = factory;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		//创建死循环
		while(true) {
			try {
				//休眠100ms
				Thread.sleep(100);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			try {
				//调用工厂中的销售方法;
				factory.sell();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}	
	}

}
           

测试类

public class Main {
	public static void main(String[] args) {
		//创建工厂对象
		Factory factory = new Factory();
		//创建销售任务对象
		SellRunnable sellRunnable = new SellRunnable(factory);
		//创建生产任务对象
		ProductRunnable productRunnable = new ProductRunnable(factory);
		//创建线程,并传入线程任务,和设置名称
		Thread t0 = new Thread(sellRunnable,"小飞");
		Thread t1 = new Thread(sellRunnable,"小焦");
		Thread t2 = new Thread(sellRunnable,"小王");
		Thread t3 = new Thread(sellRunnable,"小李");
		
		Thread t4 = new Thread(productRunnable,"牛工");
		Thread t5 = new Thread(productRunnable,"张工");
		Thread t6 = new Thread(productRunnable,"龙哥 ");
		Thread t7 = new Thread(productRunnable,"小牛");
	
		//启动线程
		t0.start();
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
		t7.start();
	}
}
           

编写思路

作用:描绘工厂的生产与销售
	分析:
	对象:
		工厂
			剩余商品数量
			最大可容纳商品数量
			生产的方法
			销售的方法
		生产人员
			死循环
				生产
		销售人员
			死循环
				销售
类:
工厂类
	属性:
		剩余商品数量
		最大可容纳商品数量
	方法:
		生产的方法,一个线程安全的方法
		步骤:
			1,判断剩余商品数量小于最大可容纳商品数量
				剩余商品数量++
				提示:谁谁谁生产了一个产品,现在还有xxx个商品
				唤醒消费线程
			2,剩余商品数量大于等于最大可容纳商品数量
				唤醒消费线程
				提示:仓库已满,生产人员xxx休息
				休眠当前线程
				销售的方法,一个线程安全的方法
		步骤:
			1,判断剩余商品数量大于0
				剩余商品数量--
				提示:谁谁谁卖出一个产品,现在还有xxx个商品
				唤醒生产者线程
			2,剩余商品数量小于等于0
				唤醒生产者线程
				提示:已经无货,销售人员xxx休息
				休眠当前线程
生产任务类
		死循环调用生产方法
		注意:生产任务与销售任务对象的所有的工厂对象为一个对象
销售任务类
		死循环调用销售方法
		注意:生产任务与销售任务对象的所有的工厂对象为一个对象
环境类
	先写main方法
		步骤:
			1,创建工厂
			2,创建生产任务,传入工厂
			3,创建销售任务,传入工厂
			4,创建生产人员
				创建生产人员对象(线程对象),传入生产任务对象
				创建生产人员对象(线程对象),传入生产任务对象
				创建生产人员对象(线程对象),传入生产任务对象
				创建生产人员对象(线程对象),传入生产任务对象
				创建生产人员对象(线程对象),传入生产任务对象
				...
			5,创建销售人员
				创建销售人员对象(线程对象),传入销售任务对象
				...
			6,启动线程