解決方式1:
並發協作模型"生產者/消費者模式"--->管程法
- 生產者:負責生產數據的模塊(可能是方法,對象,線程,進程)
- 消費者:負責處理數據的模塊(可能是方法,對象,線程,進程)
- 緩沖區:消費者不能直接使用生產者的數據,他們之間有個緩沖區,生產者將生產好的數據放入緩沖區,消費者從緩沖區拿出數據
思路:
1.首先有一個生產者,消費者、生產者只顧生產,消費者只管消費、
2.利用了一個緩沖區,緩沖了一個10個大小的數組
3.有個方法叫放入產品,產品丟進來的時候,我們判斷一下緩沖區有沒有滿,如果滿了的話,生產者就要等待了,
如果沒有滿,就將產品放進去,放進去之后有產品了,趕緊通知消費者消費
4.消費者就判斷下能不能消費呢,有沒有東西,有東西的話,我就可以直接消費,消費完了,就趕緊通知生產者生產。
如果沒有東西呢,消費者就等待。等待生產者去通知他,生產者通知了,他就可以解除等待了。
1 package com.thread.gaoji; 2 3 //測試: 生產者消費者模型-->利用緩沖區解決:管程法 4 5 //生產者 , 消費者 , 產品 , 緩沖區 6 public class TestPC { 7 8 public static void main(String[] args) { 9 SynContainer container = new SynContainer(); 10 11 new Productor(container).start(); 12 new Consumer(container).start(); 13 } 14 } 15 16 //生產者 17 class Productor extends Thread { 18 SynContainer container; 19 20 public Productor(SynContainer container) { 21 this.container = container; 22 } 23 24 //生產 25 @Override 26 public void run() { 27 for (int i = 0; i < 100; i++) { 28 container.push(new Chicken(i)); 29 System.out.println("生產了" + i + "只雞"); 30 } 31 } 32 } 33 34 //消費者 35 class Consumer extends Thread { 36 SynContainer container; 37 38 public Consumer(SynContainer container) { 39 this.container = container; 40 } 41 42 //消費 43 @Override 44 public void run() { 45 for (int i = 0; i < 100; i++) { 46 System.out.println("消費了-->" + container.pop().id + "只雞"); 47 } 48 } 49 } 50 51 //產品 52 class Chicken { 53 int id;//編號 54 55 public Chicken(int id) { 56 this.id = id; 57 } 58 } 59 60 //緩沖區 61 class SynContainer { 62 63 //需要一個容器大小 64 Chicken[] chickens = new Chicken[10]; 65 66 //容器計數器 67 int count = 0; 68 69 //生產者放入產品 70 public synchronized void push(Chicken chicken) { 71 //如果容器滿了,就需要等待消費者消費 72 if (count == chickens.length) { 73 //生產者等待 74 try { 75 this.wait(); 76 } catch (InterruptedException e) { 77 e.printStackTrace(); 78 } 79 } 80 //如果沒有滿,我們需要丟入產品 81 chickens[count] = chicken; 82 count++; 83 84 //可以通知消費者消費了. 85 this.notifyAll(); 86 } 87 88 //消費者消費產品 89 public synchronized Chicken pop() { 90 //判斷能否消費 91 if (count == 0) { 92 //消費者等待 93 try { 94 this.wait(); 95 } catch (InterruptedException e) { 96 e.printStackTrace(); 97 } 98 } 99 100 //如果可以消費 101 count--; 102 Chicken chicken = chickens[count]; 103 104 //吃完了,通知生產者生產 105 this.notifyAll(); 106 return chicken; 107 } 108 }