多線程20:管程法


解決方式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 }

 

 


免責聲明!

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



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