天天看點

生産者與消費者模式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,啟動線程