多线程:管程法

管程法

  • 生产者把生产好的数据放入缓冲区,消费者从缓冲区拿出数据
package jingcheng.test.gaoji;
//测试生产者消费者模型-->利用缓冲区解决:管程法
//生产者,消费者,产品,缓冲区
public class TestPc {
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Productor(container).start();
        new Consumer(container).start();

    }
}
//生产者
class Productor extends Thread{
    SynContainer container;
    public Productor(SynContainer container){
        this.container = container;

    }
    //生产
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("生产了"+i+"只鸡");
            container.push(new Chicken(i));

        }
    }
}
//消费者
class Consumer extends Thread{
    SynContainer container;
    public Consumer(SynContainer container){
        this.container=container;
    }
    //消费
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("消费了-->"+container.pop().id+"只鸡");
        }
    }
}
//产品
class Chicken{
    int id;//产品编号

    public Chicken(int id) {
        this.id = id;
    }
}
//缓冲区
class SynContainer{
    //需要一个容器大小
    Chicken[] chickens = new Chicken[10];
    //容器计数器
    int count = 0;
    //生产者放入产品
    public synchronized void push(Chicken chicken){
        //如果容器满了就要等待消费者消费
        if(count == chickens.length){
            try {
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //通知消费者消费,生产者等待
        }

        //如果没满,就要丢入产品
        chickens[count]=chicken;
        count++;
        //可以通知消费者消费了
        this.notifyAll();

    }

    //消费者消费产品
    public synchronized Chicken pop(){
        //判断能否消费
        if(count == 0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //等待生产者生产,消费者等待
        }
        //如果可以消费
        count--;
        Chicken chicken = chickens[count];
        //吃完了,通知生产者生产
        this.notifyAll();
        return chicken;

    }

}

生产了0只鸡
生产了1只鸡
生产了2只鸡
生产了3只鸡
生产了4只鸡
生产了5只鸡
生产了6只鸡
生产了7只鸡
生产了8只鸡
生产了9只鸡
生产了10只鸡
生产了11只鸡
消费了–>9只鸡
消费了–>10只鸡
消费了–>8只鸡
消费了–>7只鸡
消费了–>6只鸡
消费了–>5只鸡
消费了–>4只鸡
消费了–>3只鸡
消费了–>2只鸡
生产了12只鸡
生产了13只鸡
生产了14只鸡
生产了15只鸡
生产了16只鸡
生产了17只鸡
生产了18只鸡
生产了19只鸡
生产了20只鸡
消费了–>15只鸡
消费了–>19只鸡
消费了–>18只鸡
消费了–>17只鸡
消费了–>16只鸡
消费了–>14只鸡
消费了–>13只鸡
消费了–>20只鸡
消费了–>12只鸡
消费了–>11只鸡
消费了–>1只鸡
消费了–>0只鸡
生产了21只鸡
生产了22只鸡
生产了23只鸡
生产了24只鸡
生产了25只鸡
生产了26只鸡
生产了27只鸡
生产了28只鸡
生产了29只鸡
生产了30只鸡
生产了31只鸡
消费了–>30只鸡
消费了–>29只鸡
消费了–>28只鸡
消费了–>27只鸡
消费了–>26只鸡
消费了–>31只鸡
消费了–>25只鸡
消费了–>24只鸡
消费了–>23只鸡
消费了–>22只鸡
消费了–>21只鸡
生产了32只鸡
生产了33只鸡
生产了34只鸡
生产了35只鸡
生产了36只鸡
生产了37只鸡
生产了38只鸡
生产了39只鸡
生产了40只鸡
生产了41只鸡
生产了42只鸡
消费了–>41只鸡
消费了–>40只鸡
消费了–>39只鸡
生产了43只鸡
生产了44只鸡
生产了45只鸡
生产了46只鸡
消费了–>42只鸡
消费了–>45只鸡
消费了–>44只鸡
消费了–>43只鸡
消费了–>38只鸡
消费了–>37只鸡
消费了–>46只鸡
消费了–>36只鸡
消费了–>35只鸡
消费了–>34只鸡
消费了–>33只鸡
消费了–>32只鸡
生产了47只鸡
生产了48只鸡
生产了49只鸡
生产了50只鸡
生产了51只鸡
生产了52只鸡
生产了53只鸡
生产了54只鸡
生产了55只鸡
生产了56只鸡
生产了57只鸡
消费了–>56只鸡
消费了–>55只鸡
消费了–>54只鸡
消费了–>57只鸡
消费了–>53只鸡
消费了–>52只鸡
消费了–>51只鸡
消费了–>50只鸡
消费了–>49只鸡
消费了–>48只鸡
消费了–>47只鸡
生产了58只鸡
生产了59只鸡
生产了60只鸡
生产了61只鸡
生产了62只鸡
生产了63只鸡
生产了64只鸡
生产了65只鸡
生产了66只鸡
生产了67只鸡
生产了68只鸡
生产了69只鸡
消费了–>67只鸡
消费了–>68只鸡
消费了–>66只鸡
消费了–>65只鸡
消费了–>64只鸡
消费了–>63只鸡
生产了70只鸡
生产了71只鸡
生产了72只鸡
生产了73只鸡
生产了74只鸡
生产了75只鸡
消费了–>69只鸡
消费了–>74只鸡
消费了–>75只鸡
消费了–>73只鸡
消费了–>72只鸡
消费了–>71只鸡
消费了–>70只鸡
消费了–>62只鸡
消费了–>61只鸡
消费了–>60只鸡
消费了–>59只鸡
消费了–>58只鸡
生产了76只鸡
生产了77只鸡
生产了78只鸡
生产了79只鸡
生产了80只鸡
生产了81只鸡
生产了82只鸡
生产了83只鸡
生产了84只鸡
生产了85只鸡
生产了86只鸡
消费了–>85只鸡
消费了–>84只鸡
消费了–>83只鸡
消费了–>82只鸡
消费了–>81只鸡
消费了–>80只鸡
消费了–>79只鸡
消费了–>78只鸡
消费了–>77只鸡
消费了–>76只鸡
生产了87只鸡
生产了88只鸡
生产了89只鸡
生产了90只鸡
生产了91只鸡
生产了92只鸡
生产了93只鸡
生产了94只鸡
生产了95只鸡
生产了96只鸡
生产了97只鸡
消费了–>92只鸡
消费了–>96只鸡
消费了–>95只鸡
消费了–>94只鸡
消费了–>93只鸡
消费了–>91只鸡
消费了–>90只鸡
消费了–>97只鸡
消费了–>89只鸡
消费了–>88只鸡
消费了–>87只鸡
消费了–>86只鸡
生产了98只鸡
生产了99只鸡
消费了–>99只鸡
消费了–>98只鸡

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值