1 package baozi; 2 3 /* 4 生產者(包子鋪)類:是一個 線程類,繼承Thread 5 設置線程任務(run):生產包子 6 對包子 進行判斷 7 true:有包子 8 包子鋪調用wait方法進入等待狀態 9 false : 沒有包子 10 包子鋪生產包子 11 交替生產兩種包子 12 有兩種狀態(i%2==0) 13 包子鋪生產兩種包子 14 修改包子的狀態為true有 15 喚醒吃貨線程,讓吃貨線程吃包子 16 17 注意: 18 包子鋪線程和包子線程關系-->通信(互斥) 19 鎖對象必須保證唯一,可以使用包子對象作為鎖對象 20 包子鋪類和吃貨的類 就需要把保安資質對象作為參數傳遞進來 21 1,需要在成員位子創建一個包子變量 22 2,使用帶參數構造方法。為這個包子變量賦值 23 24 */ 25 public class BaoZIPu extends Thread { 26 private BaoZi bz; 27 28 public BaoZIPu(BaoZi bz){ 29 this.bz=bz; 30 } 31 32 @Override 33 public void run() { 34 int count = 0; 35 while (true) { 36 //同步技術 37 synchronized (bz) { 38 //判斷有沒有包子 39 if (bz.flag == true) { 40 //包子鋪調用wait反法進入等待狀態 41 try { 42 bz.wait(); 43 } catch (InterruptedException e) { 44 e.printStackTrace(); 45 } 46 } 47 //被喚醒之后執行,包子鋪生產包子 48 //生產兩種包子 49 if (count % 2 == 0) { 50 bz.pi = "薄皮"; 51 bz.xian = "豬肉"; 52 } else { 53 bz.pi = "厚皮"; 54 bz.xian = "牛肉"; 55 } 56 count++; 57 System.out.println("包子鋪正在生產" + bz.pi + bz.xian + "的包子"); 58 try { 59 Thread.sleep(1000); 60 } catch (InterruptedException e) { 61 e.printStackTrace(); 62 } 63 //包子鋪生產好了包子 64 //修改包子的狀態為true 65 bz.flag = true; 66 //喚醒吃貨線程,讓吃貨線程吃包子 67 bz.notify(); 68 System.out.println("包子鋪已經生產好了" + bz.pi + bz.xian + "的包子,吃貨可以開始吃了"); 69 } 70 } 71 } 72 }
1 package baozi; 2 3 /* 4 設置包子的屬性 5 皮 6 餡 7 包子的狀態:有 true 沒有 false 8 */ 9 public class BaoZi { 10 String pi; 11 String xian ; 12 //包子的狀態 有 true 沒有 fasle 13 boolean flag =false; 14 }
1 package baozi; 2 3 import baozi.BaoZi; 4 5 public class ChiHuo extends Thread { 6 private BaoZi bz; 7 public ChiHuo(BaoZi bz){ 8 this.bz=bz; 9 } 10 @Override 11 public void run() { 12 while(true){ 13 synchronized (bz){ 14 if (bz.flag==false){ 15 try { 16 bz.wait(); 17 } catch (InterruptedException e) { 18 e.printStackTrace(); 19 } 20 } 21 //被喚醒后執行的代碼 ,吃包子 22 System.out.println("吃貨正在吃"+bz.pi+bz.xian+"的包子"); 23 bz.flag=false; 24 bz.notify(); 25 System.out.println("吃貨已經把"+bz.pi+bz.xian+"的包子出完了,包子鋪開始生產包子 "); 26 System.out.println("++++++++++++++"); 27 } 28 } 29 } 30 }
1 package baozi; 2 3 import baozi.BaoZIPu; 4 import baozi.BaoZi; 5 import baozi.ChiHuo; 6 7 public class Main { 8 public static void main(String[] args) { 9 BaoZi bz = new BaoZi(); 10 //創建包子鋪線程,開始生產包子 11 new BaoZIPu(bz).start(); 12 //創建吃貨線程,開啟,吃包子 13 new ChiHuo(bz).start(); 14 } 15 16 }
運行代碼👇