首页 > 编程语言 >Java多线程-实现 生产者-消费者 模式

Java多线程-实现 生产者-消费者 模式

时间:2023-08-28 14:01:09浏览次数:33  
标签:Queue Java Thread 生产者 getName queue new 多线程 public

多线程实现生产者消费者,堆积满 100 后停止生产,消费到小于 50 后继续生产

这是一种写法,但是我觉得不太好:

  1. 它通过循环创建了很多的线程,每个线程只消费/生产一次
  2. 它使用notifyAll()通知所有的线程唤醒,包括生产者和消费者,感觉产品数量永远也达不到 50
public class Producer implements Runnable {
    private final Queue<Product> queue;
    private final int maxCapacity;

    public Producer(Queue<Product> queue, int maxCapacity) {
        this.queue = queue;
        this.maxCapacity = maxCapacity;
    }

    @Override
    public void run() {
        synchronized (queue) {
            while (queue.size() == maxCapacity) { //一定要用 while,而不是 if,下文解释
                try {
                    System.out.println("生产者" + Thread.currentThread().getName() + "等待中... Queue 已达到最大容量,无法生产");
                    queue.wait();
                    System.out.println("生产者" + Thread.currentThread().getName() + "退出等待");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            int i = new Random().nextInt();
            queue.offer(new Product("产品" + i));
            System.out.println("生产者" + Thread.currentThread().getName() + "生产了产品:" + i);

            queue.notifyAll();// 通知消费者消费
        }
    }
}

public class Consumer implements Runnable {
    private final Queue<Product> queue;
    private final int minCapacity;

    public Consumer(Queue<Product> queue, int minCapacity) {
        this.queue = queue;
        this.minCapacity = minCapacity;
    }

    @Override
    public void run() {
        synchronized (queue) {
            while (queue.isEmpty()) {
                try {
                    System.out.println("消费者" + Thread.currentThread().getName() + "等待中... Queue 已缺货,无法消费");
                    queue.wait();
                    System.out.println("消费者" + Thread.currentThread().getName() + "退出等待");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            Product product = queue.poll();
            System.out.println("消费者" + Thread.currentThread().getName() + "消费了:" + product.getName());
            if (queue.size() < minCapacity) queue.notifyAll();// 库存小于50,通知生产者生产
        }
    }
}

    public static void main(String[] args) {
        Queue<Product> queue = new ArrayDeque<>();
        for (int i = 0; i < 100; i++) {
            new Thread(new Producer(queue, 100)).start();
            new Thread(new Consumer(queue, 50)).start();
        }
    }

标签:Queue,Java,Thread,生产者,getName,queue,new,多线程,public
From: https://www.cnblogs.com/yaocy/p/17662110.html

相关文章

  • java.sql.SQLException: 无法从套接字读取更多的数据
    本来订单的生成没有问题,但不知什么原因,报了一个这样的异常,致使订单不能生成[08-11-198:07:51:344CST]00000037JDBCExceptionEcouldnotinsert:[gmit.jzt.buying.databean.EOrderDO#122594][08-11-198:07:51:344CST]00000037JDBCExceptionE......
  • IDEA设置JAVA使用的编译语言Language level为8
       设置这个为8不然每次pom文件修改都会变更为5pom.xml增加<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>8</java.version></properties>  增加插件配置<!--打包配置--&g......
  • 【Java监控】使用SkyWalking监控Java服务
    你的Java服务是如何监控的呢? 1.Null:监控?什么监控?我一个写代码的服务挂了跟我有什么关系? 2.命令行:服务挂了?内存泄漏?jstatjmapjcmd,还好不是我写的3.撸代码:Java采集JVM/服务器资源信息->Prometheus->Grafana,请允许我对业务代码稍作修改。今天,给大家介绍一个对源码0入......
  • jsp(JAVA)伪静态的具体设置过程
    一:到  http://tuckey.org/urlrewrite/  下载urlrewrite架包(推荐2.6.0)二:解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下三:把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下四:在web.xml文件中加入以下<filter><filter-name>UrlRewriteFil......
  • Java中通过代理连接至指定的URL
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.Authenticator;importjava.net.InetSocketAddress;importjava.net.PasswordAuthentication;importjava.net.Proxy;importjava.......
  • Javascript Print(*)
    1.实现打印功能1)ExecWB()通过脚本程序来调用IE菜单下面的打印命令。实现的代码如下:<scriptlanguage="javascript">functionprintsetup(){//打印页面设置wb.execwb(8,1);}functionprintpreview(){//打印页面预览wb.execwb(7,1);......
  • Javascript压缩工具
    javascriptcompressor.com(在线压缩)shrinksafe.dojotoolkit.org(在线文件压缩)dean.edwards.name/packer(在线压缩)YUICompressor(使用命令行来压缩,需要JAVA虚拟机来运行压缩程序 有个压缩比更高的,是个要注册的软件...javascriptObfuscatorhttp://www.javascript-source.......
  • 基于Java的小说阅读系统-计算机毕业设计源码+LW文档
    毕业设计(论文)的基本要求随着信息技术的发展,基于web模式的小说阅读系统逐渐普及,网上阅读是一种新型的阅读模式,其模式受到了人们的欢迎。要求:(1)学生能针对实际的小说阅读系统需求进行调研,并查阅相关资料撰写出开题报告。(2)在此基础上选用合适的开发平台与工具进行系统开发与调试。(3......
  • UI设计和java学习哪个更有前景
    这个东西首先这样说,谈到设计都是跟灵感,还有美观有关系的,所以说UI设计得跟自己的脑洞有很大的关系,而java的话,简单的程序员就是搬砖,什么意思呢,就是去网上抄写,只要你把需求搞定就好了,而java的话属于那种加班性质比较强的。学Java还是ui,两个我觉得是完全不相同的两个方面,一个是设计为主......
  • java与es8实战之三:Java API Client有关的知识点串讲
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本篇是《java与es8实战》系列的第三篇,将一些重要的知识点在这里梳理清楚,为后面的实践奠定基础一共有七个与JavaAPIClient有关的重要知识点关于namespace:每......