在生产者-消费者模型中,在原有代码基础上,把队列独立为1个类实现,通过公布接口,由生产者和消费者调用。

public class Consumer implements Runnable {int n;CountDownLatch countDownLatch;public Consumer(BlockingQueue<Integer> blockingQueue, int n, CountDownLatch countDownLatch) {this.n = n;this.countDownLatch=countDownLatch;}@Overridepublic void run() {for(int i=0;i<n;i++){try {int cur=PACqueue.consume();/*System.out.println(this.toString()+i+"处理"+cur);*/isPrime(cur);/*   System.out.println("消费"+blockingQueue.size());*/} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("消费者完成");countDownLatch.countDown();}int isPrime(int n){   //返回1表示判断为质数,0为非质数,在此没有进行输入异常检测double n_sqrt;if(n==2 || n==3) return 1;if(n%6!=1 && n%6!=5) return 0;n_sqrt=Math.floor(Math.sqrt((float)n));for(int i=5;i<=n_sqrt;i+=6){if(n%(i)==0 | n%(i+2)==0) return 0;}return 1;}}
public class Model {public  static void excute(int producerNum,int consumerNum,int num,CountDownLatch countDownLatch){BlockingQueue<Integer> blockingQueue=new LinkedBlockingQueue<>(num);for(int i=0;i<producerNum;i++){new Thread(new Producer(blockingQueue,num/producerNum,countDownLatch)).start();}for(int i=0;i<consumerNum;i++){new Thread(new Consumer(blockingQueue,num/consumerNum,countDownLatch)).start();}}public static void main(String[] args) {CountDownLatch countDownLatch=new CountDownLatch(6);long s=System.currentTimeMillis();excute(2,4,1000000,countDownLatch);try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println((double) (System.currentTimeMillis()-s)/1000);}
}
public class PACqueue {//Java 阻塞队列在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。private static BlockingQueue<Integer> blockingQueue=new LinkedBlockingQueue<>(1000000);public static void produce (int n)throws InterruptedException{blockingQueue.put(n);}public static int  consume ()throws InterruptedException{return blockingQueue.take();}}
public class Producer implements Runnable{int n;CountDownLatch countDownLatch;public Producer(BlockingQueue<Integer> blockingQueue, int n,CountDownLatch countDownLatch) {this.n = n;this.countDownLatch=countDownLatch;}@Overridepublic void run() {Random ra =new Random();for(int i=0;i<n;i++){try {/*  System.out.println(this.toString()+i+"生产");*/PACqueue.produce(ra.nextInt(2000000000)+1);/*    System.out.println("生产"+blockingQueue.size());*/} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("生产者完成");countDownLatch.countDown();}
}

分布与并行计算—生产者消费者模型队列(Java)相关推荐

  1. 分布与并行计算—生产者消费者模型实现(Java)

    在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的模 ...

  2. 分布与并行计算—生产者消费者模型RabbitMQ(Java)

    连接工具 public class ConnectionUtil {public static final String QUEUE_NAME="firstQueue";priva ...

  3. java生产消费模型代码实现_生产者-消费者模型的Java实现

    本文转自:http://tanlan.iteye.com/blog/1158154 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个 ...

  4. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  5. 队列、生产者消费者模型

    目录 队列.生产者消费者模型.初识线程 一.用进程锁来优化抢票小程序 1.1 进程锁 1.2 优化抢票小程序 二.队列 2.1 队列的介绍 2.2 创建队列的类 2.3 使用队列的案例 三.生产者消费 ...

  6. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  7. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. wait, notify 和 noti ...

  8. pattern in java_Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

    生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...

  9. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

最新文章

  1. 人体姿态fast-human-pose-estimation.pytorch
  2. 华为鸿蒙系统支持智慧多屏吗,搭载鸿蒙OS!华为宣布企业智慧屏:多屏协同、底座带轮子...
  3. (1)stm32开发之标准库的介绍
  4. apache kafka_Apache Kafka消费者再平衡
  5. INTEL和AMD两大巨头的前身
  6. js获取一个月份最大天数和获取月的最后一天
  7. 微信小程序 自定义顶部状态栏
  8. 非root用户安装nginx
  9. windows如何设置新建文本文档快捷键
  10. VSC为_LCC 和 VSC (MMC) 的底层特性区别
  11. edgewin10无法安装_处理win10无法打开edge怎么解决
  12. Python解决“鸡兔同笼”问题
  13. 一名武大同学的春招48小时
  14. 最长对称字符串php_PHP-字符串过长不用担心
  15. springboot获取企业微信的access_token凭证
  16. 如何去做一个好的循迹小车
  17. fastadmin with 和 filed 合用导致field失效
  18. rabb.it和uzer.me 两个在线观看 youtube / goolge在协同办公平台
  19. 使用VS code搭建Arduino IDE环境
  20. 云储存将成未来大规模视频监控储存主要模式

热门文章

  1. exit与_exit函fork与vfork函数
  2. LeetCode2:Add Two Numbers
  3. NDK学习笔记-使用现有so动态库
  4. echo(),print(),print_r(),var_dump()的区别
  5. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
  6. python3 递归
  7. malloc、calloc、realloc和alloca各种的区别
  8. cordova 项目添加splash启动界面
  9. Android API中被忽略的几个函数接口
  10. python基础课程_2学习笔记3:图形用户界面