懶得寫了,直接看代碼把
手機類
/** * 手機類 * 最多生產多少手機 * @author HWUA * */ public class Shouji{ public int max; //定義容器最大容量 public int currentNum;//定義容器當前容量 public Shouji(int max){ this.max = max; currentNum = 0; } }
生產類
//生產手機類 public class Sjphone1 implements Runnable{ public Shouji con; public Sjphone1(Shouji con){//構造函數 this.con = con; } public void run(){ while(true){//一直運行 synchronized(con){//手機類鎖 if(con.currentNum < con.max){//若當前容器不滿,則可以生產 con.notify();//生產完則通知並釋放鎖 con.currentNum++; System.out.println(" 生產者正在生產小米手機1部, 當前產品數:"+con.currentNum+"部"); }else if(con.currentNum == con.max){//若生產手機等於最大定義手機市場容量 System.out.println("手機生產已經飽和,生產者停止生產,正在等待消費..."); try { con.wait();//暫停生產 並釋放鎖 } catch (InterruptedException e) { e.printStackTrace(); } }//if else if }//syn 執行完同步塊 釋放鎖,輸出結果中連續出現兩次生產者是因為:釋放鎖后,若沒有等待線程,則還是先執行到哪個線程的同步塊就執行它 try { Thread.sleep(100);//調節生產者頻率,過快容易猝死~~ } catch (InterruptedException e) { e.printStackTrace(); }//try }//while } }
消費類
//消費類 public class Sjphone2 implements Runnable{ public Shouji con; public Sjphone2(Shouji con){//構造函數 this.con = con; } public void run(){ while(true){//一直運行 synchronized(con){//手機鎖 if(con.currentNum > 0 ){//當有手機的時候 con.notify();//購買手機 並釋放鎖 con.currentNum--; System.out.println(" 消費者正在消費小米手機賣出1部, 當前產品數:"+con.currentNum+"部"); }else if(con.currentNum == 0){//若沒有手機了 System.out.println("手機已經買完了,消費者停止消費,正在等待生產..."); try { con.wait();//暫停消費 並釋放鎖 } catch (InterruptedException e) { e.printStackTrace(); } }//else if }//syn try { Thread.sleep(140);//調節消費者頻率,過快容易撐死~~ } catch (InterruptedException e) { e.printStackTrace(); }//try }//while }// run }
測試類main
/** * 測試類 */ public class Dome01{ public static void main(String args[]){ Shouji container = new Shouji(5);//定義最大定義手機市場容量,此處為5 Sjphone1 sj1 = new Sjphone1(container);//箱子中的手機數要同步,所以將手機對象引用作為形參傳給生產者和消費者 Sjphone2 sj2 = new Sjphone2(container);//同上 //啟動生產消費模式 new Thread(sj1, "生產").start(); new Thread(sj2, "消費").start(); } }
注意記得鎖的對象一定要是
構造函數 對應
Shouji 類
同一個對象,不然線程會亂跑,沒有規律,一定要鎖起來