1. 程式人生 > 其它 >JavaSE-20.3【生產者消費者】

JavaSE-20.3【生產者消費者】

  1 package day11.lesson3;
  2 
  3 /*
  4 3 生產者消費者
  5 
  6 3.1 生產者消費者模式
  7 
  8     生產者消費者模式是一個十分經典的多執行緒協作的模式,弄懂生產者消費者問題能夠讓我們對多執行緒程式設計的理解更加深刻。
  9     所謂生產者消費者問題,實際上主要是包含了兩類執行緒:
 10         一類是生產者執行緒用於生產資料
 11         一類是消費者執行緒用於消費資料
 12     為了解耦生產者和消費者的關係,通常會採用共享的資料區域,就像是一個倉庫(見圖)
 13         生產者生產資料之後直接放置在共享資料區中,並不需要關心消費者的行為
14 消費者只需要從共享資料區中去獲取資料,並不需要關心生產者的行為 15 16 Object類的等待和喚醒方法 17 void wait() 導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法 18 void notify() 喚醒正在等待物件監視器的單個執行緒 19 void notifyAll() 喚醒正在等待物件監視器的所有執行緒 20 21 3.2 生產者消費者案例 22 23 生產者消費者案例中包含的類: 24 奶箱類(Box):定義一個成員變數,表示第x瓶奶,提供儲存牛奶和獲取牛奶的操作
25 生產者類(Producer):實現Runnable介面,重寫run()方法,呼叫儲存牛奶的操作 26 消費者類(Customer):實現Runnable介面,重寫run()方法,呼叫獲取牛奶的操作 27 測試類(BoxDemo):裡面有main方法,main方法中的程式碼步驟如下 28 ①建立奶箱物件,這是共享資料區域 29 ②建立消費者建立生產者物件,把奶箱物件作為構造方法引數傳遞,因為在這個類中要呼叫儲存牛奶的操作 30 ③物件,把奶箱物件作為構造方法引數傳遞,因為在這個類中要呼叫獲取牛奶的操作
31 ④建立2個執行緒物件,分別把生產者物件和消費者物件作為構造方法引數傳遞 32 ⑤啟動執行緒 33 */ 34 public class BoxDemo { 35 public static void main(String[] args) { 36 Box b = new Box(); 37 Producer p = new Producer(b); 38 Customer c = new Customer(b); 39 40 Thread t1 = new Thread(p); 41 Thread t2 = new Thread(c); 42 43 t1.start(); 44 t2.start(); 45 } 46 } 47 48 49 class Box{ 50 private int milk; //第幾瓶奶 51 private boolean state = false; //奶箱狀態 52 53 public synchronized void put(int milk){ 54 //奶箱中若有牛奶,則等待消費 55 if (state){ 56 try { 57 wait(); // 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 } 61 } 62 63 //奶箱中若無牛奶,則生產牛奶 64 this.milk = milk; 65 System.out.println("送奶工將第" + this.milk + "瓶奶放入奶箱"); 66 67 //生產牛奶完畢後,修改奶箱狀態 68 state = true; 69 70 //喚醒其他等待的執行緒 71 notifyAll(); 72 } 73 74 public synchronized void get(){ 75 //奶箱中若無牛奶,則等待生產 76 if (!state){ 77 try { 78 wait(); // 79 } catch (InterruptedException e) { 80 e.printStackTrace(); 81 } 82 } 83 84 //奶箱中若有牛奶,則等待消費 85 System.out.println("使用者拿到第" + this.milk + "瓶奶"); 86 87 //消費牛奶完畢後,修改奶箱狀態 88 state = false; 89 90 //喚醒其他等待的執行緒 91 notifyAll(); 92 } 93 } 94 95 96 class Producer implements Runnable{ 97 private Box b; 98 99 public Producer(Box b) { 100 this.b = b; 101 } 102 103 @Override 104 public void run() { 105 for (int i=1; i<=5; i++){ 106 b.put(i); 107 } 108 } 109 } 110 111 112 class Customer implements Runnable{ 113 private Box b; 114 115 public Customer(Box b) { 116 this.b = b; 117 } 118 119 @Override 120 public void run() { 121 while (true){ 122 b.get(); 123 } 124 } 125 }