线程协作---生产者消费者模式之“管程法”实现

Posted fangtingfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程协作---生产者消费者模式之“管程法”实现相关的知识,希望对你有一定的参考价值。

 1 package cn.ftf.threadcooperation;
 2 /**
 3  * 协作模型:生产者消费者模式实现方式一:管程法,借助一个缓冲区
 4  * @author 房廷飞
 5  *
 6  */
 7 
 8 public class CoTest01 
 9     public static void main(String[] args) 
10         SyContainer sy=new SyContainer();
11         Productor pro=new Productor(sy);
12         pro.start();
13         Consumer con = new Consumer(sy);
14         con.start();
15     
16 
17 
18 
19 //生产者
20 class Productor extends Thread
21     SyContainer sycon;
22     public Productor(SyContainer sycon) 
23         super();
24         this.sycon = sycon;
25     
26     public void run() 
27         for(int i=0;i<100;i++) 
28             System.out.println("生产第"+i+"个馒头");
29             sycon.push(new Streamedbun(i));
30             
31         
32     
33 
34 
35 //消费者
36 class Consumer extends Thread
37     SyContainer sycon;
38     
39     public Consumer(SyContainer sycon) 
40         super();
41         this.sycon = sycon;
42     
43     public void run() 
44         for(int i=0;i<100;i++) 
45             System.out.println("消费第"+sycon.pop().id+"个馒头");
46 
47             
48         
49     
50     
51 
52 
53 //缓冲区
54 class SyContainer
55     Streamedbun[] buns=new Streamedbun[100];
56     int count = 0;  //计数器
57     //
58     public synchronized void push(Streamedbun bun)      //加入synchronized关键字        
59         //加入可以生产条件:需要容器存在空间;不能生产,抛锁等待,避免容器越界错误
60         if(count==buns.length) 
61             try 
62                 this.wait();
63              catch (InterruptedException e) 
64                 // TODO Auto-generated catch block
65                 e.printStackTrace();
66             
67         
68         buns[count] = bun;    
69         count++;    
70         this.notifyAll();   //唤醒所有的等待者
71     
72     //
73     public synchronized Streamedbun pop()        ////加入synchronized关键字
74         //加入可以取的条件,避免容器越界错误
75         if(count==0) 
76             try 
77                 this.wait();     //每个对象都有一个wait,将锁抛出,线程阻塞,生产者通知消费解除
78              catch (InterruptedException e) 
79                 // TODO Auto-generated catch block
80                 e.printStackTrace();
81                       
82             
83         count--;
84         Streamedbun bun=buns[count];
85         this.notifyAll();   //唤醒所有的等待者
86         return bun;
87     
88 
89 
90 
91 
92 //数据(馒头)
93 class Streamedbun
94     int id;
95     public Streamedbun(int id) 
96         super();
97         this.id = id;
98     
99 

 

以上是关于线程协作---生产者消费者模式之“管程法”实现的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程-生产者消费者模式-管程法

多线程_并发协作

线程间的通信 与 线程池

多线程——生产者消费者问题-----管程法

Java多线程之并发协作生产者消费者设计模式

Java多线程之并发协作生产者消费者设计模式