ProducerConsumerDemo

简介:   package algorithm; public class ProducerConsumer { public static void main(String[] args) { SyncStack ss = new SyncStack(); new Thread(new Producer(ss, "p1")).

 

 

package algorithm;

public class ProducerConsumer {
    public static void main(String[] args) {
        SyncStack ss = new SyncStack();

        new Thread(new Producer(ss, "p1")).start();
        new Thread(new Consumer(ss, "c1")).start();
        new Thread(new Producer(ss, "p2")).start();
        new Thread(new Consumer(ss, "c2")).start();
    }
}

class WoTou {
    private int id;

    public WoTou(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public String toString() {
        return "WT" + getId();
    }
}

class SyncStack {
    private int index = 0;
    private WoTou[] arrWT = new WoTou[6];

    public synchronized void push(WoTou wt) {
        while (index == arrWT.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
            }
        }
        this.notifyAll();
        arrWT[index++] = wt;
    }

    public synchronized WoTou pop() {
        while (index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
            }
        }
        this.notifyAll();
        return arrWT[--index];
    }
}

class Producer implements Runnable {
    private SyncStack ss = null;
    private String name;

    public Producer(SyncStack ss, String name) {
        this.ss = ss;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void run() {
        for (int i = 0; i < 60; i++) {
            WoTou wt = new WoTou(i);
            ss.push(wt);
            System.out.println(getName() + "生产" + wt);
            try {
                Thread.sleep((long) (Math.random() * 100));
            } catch (InterruptedException e) {
            }
        }
    }
}

class Consumer implements Runnable {
    private SyncStack ss = null;
    private String name;

    public Consumer(SyncStack ss, String name) {
        this.ss = ss;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void run() {
        for (int i = 0; i < 60; i++) {
            WoTou wt = ss.pop();
            System.out.println(getName() + "消费" + wt);
            try {
                Thread.sleep((long) (Math.random() * 400));
            } catch (InterruptedException e) {
            }
        }
    }
}


Output:

p1生产WT0
p2生产WT0
c1消费WT0
c2消费WT0
p2生产WT1
p1生产WT1
p2生产WT2
p2生产WT3
p2生产WT4
p2生产WT5
c2消费WT5
p2生产WT6
c1消费WT6
p1生产WT2
c2消费WT2
p1生产WT3
c2消费WT3
p2生产WT7
c1消费WT7
p1生产WT4
c2消费WT4
p1生产WT5
c2消费WT5
p2生产WT8
c1消费WT8
p2生产WT9
c1消费WT9
p1生产WT6
p2生产WT10
c2消费WT6
c1消费WT10
p2生产WT11
p2生产WT12
c2消费WT11
c1消费WT12
p2生产WT13
c2消费WT13
p2生产WT14
c1消费WT14
p1生产WT7
c1消费WT7
p2生产WT15
c2消费WT15
p2生产WT16
p2生产WT17
c2消费WT16
c1消费WT17
p2生产WT18
c2消费WT18
p2生产WT19
p2生产WT20
c1消费WT19
c2消费WT20
p2生产WT21
p1生产WT8
c2消费WT21
p2生产WT22
c2消费WT8
c1消费WT22
p1生产WT9
c2消费WT9
p1生产WT10
c1消费WT10
p1生产WT11
c2消费WT11
p2生产WT23
c2消费WT23
p2生产WT24
c1消费WT24
p1生产WT12
c1消费WT12
p2生产WT25
c2消费WT25
p2生产WT26
p2生产WT27
c1消费WT26
c1消费WT27
p1生产WT13
c1消费WT13
p1生产WT14
c2消费WT14
p2生产WT28
c2消费WT28
p2生产WT29
c1消费WT29
p2生产WT30
c2消费WT30
p2生产WT31
p2生产WT32
c1消费WT31
c2消费WT32
p2生产WT33
c1消费WT33
p2生产WT34
c2消费WT34
p2生产WT35
c1消费WT35
p1生产WT15
c1消费WT15
p1生产WT16
p2生产WT36
c2消费WT16
c2消费WT36
p1生产WT17
c2消费WT17
p2生产WT37
c1消费WT37
p1生产WT18
c1消费WT18
p1生产WT19
c2消费WT19
p1生产WT20
c1消费WT20
p1生产WT21
p1生产WT22
c2消费WT21
c1消费WT22
p1生产WT23
c1消费WT23
p1生产WT24
c2消费WT24
p1生产WT25
c2消费WT25
p2生产WT38
p1生产WT26
c2消费WT38
c2消费WT26
p1生产WT27
c2消费WT27
p1生产WT28
c1消费WT28
p1生产WT29
c2消费WT29
p1生产WT30
c2消费WT30
p1生产WT31
c1消费WT31
p1生产WT32
c2消费WT32
p1生产WT33
c1消费WT33
p1生产WT34
p2生产WT39
c2消费WT34
c2消费WT39
p1生产WT35
p1生产WT36
c1消费WT35
p2生产WT40
c2消费WT36
p2生产WT41
c2消费WT40
c2消费WT41
p2生产WT42
c1消费WT42
p2生产WT43
p1生产WT37
c1消费WT43
p1生产WT38
c2消费WT37
c1消费WT38
p2生产WT44
c2消费WT44
p2生产WT45
c1消费WT45
p2生产WT46
c1消费WT46
p2生产WT47
c2消费WT47
p2生产WT48
c1消费WT48
p1生产WT39
c1消费WT39
p2生产WT49
c2消费WT49
p2生产WT50

http://ixhong.iteye.com/blog/2228623

 

相关文章
|
12月前
|
存储 编解码 监控
基于PythonOpenCv的视频图像处理
基于PythonOpenCv的视频图像处理
154 0
|
消息中间件 Java Apache
Rocketmq整合Spring中的推消费和litepull消费
RocketMQ整合Spring中推拉模式的相关配置介绍和遇到推拉配置出现的问题的解决
431 0
|
IDE 算法 开发工具
labview与stm32通信
labview与stm32通信
165 0
|
消息中间件 Java RocketMQ
RocketMQ-Spring学习
们可以它的一系列动作操作,会首先将相关配置MessageConverterConfiguration、ListenerContainerConfiguration、ExtProducerResetConfiguration、ExtConsumerResetConfiguration、RocketMQTransactionConfiguration、RocketMQListenerConfiguration进行导入。在自动注入前处理事务配置RocketMQTransactionConfiguration,在自动注入后处理消息转换器配置MessageConverterConfiguration。
1044 0
RocketMQ-Spring学习
|
JSON Java 数据格式
发送下单成功短信案例|学习笔记
快速学习发送下单成功短信案例
220 0
发送下单成功短信案例|学习笔记
|
消息中间件 负载均衡 Java
RocketMQ,同一个topic下是否可以通过不同的tag来进行订阅吗?
RocketMQ,同一个topic下是否可以通过不同的tag来进行订阅吗?
1258 0
|
Java 应用服务中间件 HSF
多租户微服务中使用Java Config注册HSF服务
有了速卖通中间件的spring-boot-starter-hsf,在基于Spring Boot微服务中使用HSF,是件简单而惬意的事情。 我们首先来看最简单
4758 0
|
3天前
|
关系型数据库 Serverless 分布式数据库
高峰无忧,探索PolarDB PG版Serverless的弹性魅力
在数字经济时代,数据库成为企业命脉,面对爆炸式增长的数据,企业面临管理挑战。云原生和Serverless技术革新数据库领域,PolarDB PG Serverless作为阿里云的云原生数据库解决方案,融合Serverless与PostgreSQL,实现自动弹性扩展,按需计费,降低运维成本。它通过计算与存储分离技术,提供高可用性、灾备策略和简化运维。PolarDB PG Serverless智能应变业务峰值,实时监控与调整资源,确保性能稳定。通过免费体验,用户可观察其弹性性能和价格力,感受技术优势。
|
12天前
|
Kubernetes 安全 Devops
【云效流水线 Flow 测评】驾驭云海:五大场景下的云效Flow实战部署评测
云效是一款企业级持续集成和持续交付工具,提供免费、高可用的服务,集成阿里云多种服务,支持蓝绿、分批、金丝雀等发布策略。其亮点包括快速定位问题、节省维护成本、丰富的企业级特性及与团队协作的契合。基础版和高级版分别针对小型企业和大规模团队,提供不同功能和服务。此外,云效对比Jenkins在集成阿里云服务和易用性上有优势。通过实战演示了云效在ECS和K8s上的快速部署流程,以及代码质量检测和AI智能排查功能,展示了其在DevOps流程中的高效和便捷,适合不同规模的企业使用。本文撰写用时5小时,请各位看官帮忙多多支持,如有建议也请一并给出,您的建议能帮助我下一篇更加出色。
136105 16
|
13天前
|
存储 缓存 监控
你的Redis真的变慢了吗?性能优化如何做
本文先讲述了Redis变慢的判别方法,后面讲述了如何提升性能。
102160 2