JAVA 多線程實現包子鋪(買包子,吃包子)


 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 }

運行代碼👇

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM