ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程生产者消费者问题

2020-12-06 23:32:19  阅读:171  来源: 互联网

标签:container 消费者 生产者 void tv TV new 多线程 public


生产者消费者模型-->利用缓冲区解决: 管程法

package Thread;

/**
 * @author 85726
 * 测试,生产者消费者模型-->利用缓冲区解决: 管程法
 */
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++) {
            container.push(new Chicken(i));
            System.out.println("生产了" + 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) {
                e.printStackTrace();
            }
        }

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


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

生产者消费者模型-->信号灯法,标志位解决

 1 package Thread;
 2 
 3 import javax.net.ssl.SSLContext;
 4 
 5 //测试生产者消费者问题2:信号灯法,标志位解决
 6 public class MyLockTest {
 7     public static void main(String[] args) {
 8         TV tv=new TV();
 9         new Player(tv).start();
10         new Watcher(tv).start();
11 
12     }
13 
14 }
15 //生产者:演员
16 class Player extends Thread{
17     TV tv=new TV();
18 
19     public Player(TV tv) {
20         this.tv=tv;
21     }
22 
23     @Override
24     public void run() {
25         for (int i = 0; i < 20; i++) {
26             if (i % 3 == 0) {
27                 tv.play("插播广告");
28             }else {
29                 tv.play("战狼播放中");
30             }
31 
32         }
33     }
34 }
35 //消费者:观众
36 class  Watcher extends Thread{
37     TV tv=new TV();
38 
39     public Watcher(TV tv) {
40         this.tv=tv;
41     }
42 
43     @Override
44     public void run() {
45         for (int i = 0; i < 20; i++) {
46             tv.watch();
47         }
48     }
49 }
50 //产品:节目
51 class TV{
52     //演员演戏,观众等待 True
53     //观众观看,演员等待 false
54 
55     String voice;  //表演的节目
56     boolean flag=true;
57 
58     //表演
59     public synchronized void play(String voice) {
60         if (!flag) {
61             try {
62                 this.wait();
63             } catch (InterruptedException e) {
64                 e.printStackTrace();
65             }
66         }
67         System.out.println("演员表演了" + voice);
68         //通知观众观看
69         this.notifyAll();
70         this.voice=voice;
71         this.flag=!this.flag;
72 
73     }
74 
75     //观看
76     public synchronized void watch() {
77         if (flag) {
78             try {
79                 this.wait();
80             } catch (InterruptedException e) {
81                 e.printStackTrace();
82             }
83         }
84         System.out.println("    "+"观看了"+voice);
85         //通知演员表演
86         this.notifyAll();
87         this.flag=!this.flag;
88     }
89 
90 }

 

标签:container,消费者,生产者,void,tv,TV,new,多线程,public
来源: https://www.cnblogs.com/dragon-lan/p/14095000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有