本人并发小白,如果有可以优化的地方欢迎评论交流~

题目如下:

​  15个生产者生产1000条数据(从1开始,每生产一条加1),并向消息队列中存放字符串(“第m个生产者生产数据n”),同时3个消费者消费数据,并将数据n累加最后输出

代码如下:

生产者:

package com.lcy.thread.parta;import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;/*** 功能描述:生产者** @author liuchaoyong* @version 1.0* @date 2020/1/7 19:49*/
public class Producer implements Runnable{LinkedBlockingQueue<String> queue;private AtomicInteger data;Producer(LinkedBlockingQueue<String> queue,AtomicInteger data){this.queue=queue;this.data=data;}@Overridepublic void run() {//小于1000就一直生产while (data.get() <= Test.MAX) {String s = "第" + Thread.currentThread().getName() + "个生产者生产" + data.getAndIncrement();System.out.println(s);queue.offer(s);}}
}

消费者:

package com.lcy.thread.parta;import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;/*** 功能描述:消费者** @author liuchaoyong* @version 1.0* @date 2020/1/7 20:00*/
public class Consumer implements Runnable{private LinkedBlockingQueue<String> queue;private AtomicInteger sum;private AtomicInteger time;Consumer(LinkedBlockingQueue<String> queue,AtomicInteger time,AtomicInteger sum){this.queue=queue;this.time=time;this.sum=sum;}@Overridepublic void run() {while (time.get() != Test.MAX) {String poll = queue.poll();if (poll != null) {sum.getAndAdd(Integer.parseInt(poll.substring(poll.lastIndexOf("产") + 1)));time.getAndIncrement();}}}
}

测试类:

package com.lcy.thread.parta;import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/*** 功能描述:** @author liuchaoyong* @version 1.0* @date 2020/1/7 20:07*/
public class Test {public static final int MAX = 1000;/***消息队列*/private static LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();/*** 生产者当前生产的数据*/private static AtomicInteger data = new AtomicInteger(1);/*** 累加器*/private static AtomicInteger sum = new AtomicInteger(0);/*** 消费者当前消费次数*/private static AtomicInteger time = new AtomicInteger(0);/*** 生产者线程池*/private static ThreadPoolExecutor producerExecutor;/*** 消费者线程池*/private static ThreadPoolExecutor consumerExecutor;static {producerExecutor = new ThreadPoolExecutor(15, 15, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadFactory() {private AtomicInteger num = new AtomicInteger(0);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, num.incrementAndGet() + "");}});consumerExecutor = new ThreadPoolExecutor(3, 3, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), (ThreadFactory) Thread::new);}public static void main(String[] args) {for (int i = 0; i < 15; i++) {producerExecutor.execute(new Producer(queue, data));}for (int i = 0; i < 3; i++) {consumerExecutor.execute(new Consumer(queue,time, sum));}//加到1000了就关闭生产者,并等待剩余生产者任务结束do {if (data.get() >= MAX && !producerExecutor.isShutdown()) {producerExecutor.shutdown();}} while (!producerExecutor.isTerminated());//取了1000次数据就关闭消费者,并等待消费者任务结束while (true) {if (time.get() >= MAX && !consumerExecutor.isShutdown()) {consumerExecutor.shutdown();break;}}System.out.println(sum.get());}}

java线程池实现生产者消费者模式相关推荐

  1. Qt之线程同步(生产者消费者模式 - QSemaphore)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有 ...

  2. Qt之线程同步(生产者消费者模式 - QWaitCondition)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mut ...

  3. Java并发编程实战~生产者-消费者模式

    前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...

  4. 线程池原理——生产者/消费者

    import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import ...

  5. Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...

  6. Java线程池实现多消费者批量处理队列消息

    通常生产者-消费者的经典实现方式是,启动一个消费者线程从阻塞队列里获取消息进行消费,(多个)生产者往队列里插入待消费的数据然后立即返回.如果生产者生产的速率远大于消费者消费的速率,那么队列的待处理数据 ...

  7. Java多线程:解决生产者/消费者模式

    什么是生产者/消费者模式 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品. 具体来说就是: 生产者 ...

  8. 生产者消费者_【Java面试】实现生产者消费者模式

    使用 BlockingQueue 实现生产者消费者模式 public class ProducerConsumerModel2 { private static BlockingQueue queue ...

  9. 【趣说JAVA】什么是生产者消费者模式?用恶趣味的方式来解释

    故事背景: 从前有一个产奥力给怪物叫扎克,因为自己喜欢产奥力给,所以没人喜欢它,它很自卑,直到有天遇到了一个叫老八的吞翔人,两人惺惺相惜,上演了一出生产者和消费者模式的gay情故事.扎克拉完到厕所,厕 ...

最新文章

  1. AgileEAS.NET平台开发实例-药店系统-报表开发(上)
  2. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
  3. 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
  4. 如何查找SAP Fiori UI上某个字段对应的底层数据库表
  5. gradle创建web工程_Gradle入门:创建Web应用程序项目
  6. 链表题目--1 删除链表中所有等于val的值
  7. 《计算机网络》第六章:传输层(The Transport Layer)
  8. LIBSVM在Matlab下的使用
  9. 1.1.15 word调整文字与下划线之间的间距
  10. Sharepoint SSL(Https)
  11. 字典攻击——彩虹表攻击与防御
  12. contos7改分辨率_centos桌面分辨率修改
  13. 基于SRIO总线的高速通信
  14. PHP控制连接打印机
  15. 瞬态抑制二极管有方向吗?
  16. 电信 网通 铁通 DNS服务器IP地址
  17. Python 逐行读取txt文件,批量下载文件
  18. maya将模型导入到unity
  19. 鸿蒙用户突破3亿,拳打谷歌安卓,脚踢苹果iOS
  20. 第一章 JSON语法用法

热门文章

  1. 如何实现返回顶部功能
  2. 2023系统分析师论文范文模板
  3. text-align的用法
  4. CVE-2020-8840:Jackson-databind RCE
  5. mybatis中xml转义
  6. 揭秘手机预装乱象:隐身屏幕内的“食费”利益链
  7. 【NOI Online 2022 提高组 B】【洛谷 P8252】讨论 题解
  8. 字节跳动如何系统性治理 iOS 稳定性问题
  9. 视频框架 Vitamio 使用教程+部分心得(一)准备
  10. 外贸建站多少钱?不同预算对应的建站方案!