java:生產者與消費者隨機多數量生產與消費
阿新 • • 發佈:2018-12-04
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 { }