1. 程式人生 > >java:生產者與消費者隨機多數量生產與消費

java:生產者與消費者隨機多數量生產與消費

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

/*
4個生產者隨機生產n個麵包,要求每人每次最多不能超過40個,而且總共最多不能生產超過100個,
同時,有5個消費者隨機消費這些麵包,每人每次不能消費超過30個。 
要求列印以下資訊:
例如: 生產者XX  生產 6個麵包
             消費者XX  消費4個麵包
    如果滿了,則列印:  已經達到100個了!請停止生產..
    如果空了,則列印: 已經吃空了!請速度生產...*/
public class Bakery {// 麵包房存放麵包
	Bread bread;// 有面包
	List<Bread> list = new ArrayList<Bread>();// 有一個list裡面可以放很多面包
	int holdermax = 100;// 共可以放的數量 最多不能超過100個
	int count = 0;

	public List<Bread> getList() {
		return list;
	}

	/*
	 * public void setList(List<Bread> list) { this.list = list; }
	 * 
	 * /** 放list裡面加麵包的方法
	 * 
	 * @throws InterruptedException
	 */
	public synchronized void push(Bread bread) throws InterruptedException {// 得到一個麵包
		// 判斷加滿的時候
		if (list.size() >= holdermax) {
			wait();// 等待,太多了,不能再放麵包了
			System.out.println("已有" + (list.size() + 1) + "個,已放滿,請等待");
			return;// 沒有加return會一直走判斷流程
		}
		list.add(bread);// 加麵包
		notify();// 動作已做完,通知另一個執行緒
	}

	/**
	 * 放list裡面取 麵包的方法
	 * 
	 * @throws InterruptedException
	 */
	public synchronized void down() throws InterruptedException {
		// 判斷取空的時候
		if (list.size() <= 0) {// 不於1個的時候,進入if等待
			wait();
			System.out.println("剩餘" + list.size() + "個,不多了,請等待");
			return;
		}
		list.remove(0);// 減去list裡面的麵包數
		notify();// 動作已做完,通知另一個執行緒
	}
	/**
	 * 返回一個0-100的隨機數
	 * 
	 * @return
	 */
	public int addRandon() {
		int b = 0;
		float a = (float) Math.random() * 100;// 產生一個0-1之間的數,再*100
		if(a==0){
			addRandon();//不能讓這個數等於0
		}
		return b = (int) a;// 去掉小數點後面的數
	}
}



//消費者

public class Consumer implements Runnable {
	// 有一個Bakery
	Bakery bakery;

	public Consumer(Bakery bakery) {
		super();
		this.bakery = bakery;
	}
	public void reduce() {
		int b = 0;
		while (true) {
			try {
				for (int i = 0; i < bakery.addRandon(); i++) {
					if (i > 30) {
						notify();
						return;
					} else {
						bakery.down();
						b = i;
					}
				}
				System.out.println(Thread.currentThread().getName() + "消費了" + b + "個麵包");
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		reduce();

	}

}

//生產者----------------------------------------------------
package 生產者與消費者2;

public class Producer implements Runnable {
	// 有一個Bakery
	Bakery bakery;

	public Producer(Bakery bakery) {
		super();
		this.bakery = bakery;
	}

	public void add() {
		int b = 0;
		while (true) {// 加上while,讓他無限迴圈,要不然到最大數量後,就會自動停止
			Bread bread = new Bread();
			try {
				for (int i = 0; i < bakery.addRandon(); i++) {// 迴圈多少次,等於生產多少次
					if (i > 40) {
						notify();
						return;
					} else {
						bakery.push(bread);// 呼叫方法,加一個麵包進去
						b = i;
					}
				}
				System.out.println(Thread.currentThread().getName() + "生產" + b + "個麵包");
				Thread.sleep(300);

			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		add();

	}

}

--------------------------------------------
public class Bread {

}