用Java解决生产者-消费者问题
- 生产者生产物品。
- 消费者消费生产者生产的物品。
- 生产者完成生产,并让消费者知道他们已经完成了。
- 消耗该项目的步骤独立产生,而不依赖于其他项目。
- 处理项目的时间大于生产项目的时间。
- 可以有多个生产者。
- 将有多个消费者。
- 一旦完成新物品的生产,生产者将告知消费者,以便消费者在消费并加工完最后一件物品后退出。
package com.maximus.producerconsumer;public interface Consumer
{public boolean consume(Item j);public void finishConsumption();
}
在这里,可以由多个类似商品的生产者共享消费者。 类似的项目,我的意思是生产者,其生产“项目”类型的对象。 Item的定义如下:
package com.maximus.consumer;public interface Item
{public void process();
}
现在我们来看一下Consumer接口的实现:
package com.maximus.consumer;import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;public class ConsumerImpl implements Consumer
{private BlockingQueue< Item > itemQueue = new LinkedBlockingQueue<Item>();private ExecutorService executorService = Executors.newCachedThreadPool();private List<ItemProcessor> jobList = new LinkedList<ItemProcessor>();private volatile boolean shutdownCalled = false;public ConsumerImpl(int poolSize){for(int i = 0; i < poolSize; i++){ItemProcessor jobThread = new ItemProcessor(itemQueue);jobList.add(jobThread);executorService.submit(jobThread);}}public boolean consume(Item j){if(!shutdownCalled){try{itemQueue.put(j);}catch(InterruptedException ie){Thread.currentThread().interrupt();return false;}return true;}else{return false;}}public void finishConsumption(){for(ItemProcessor j : jobList){j.cancelExecution();}executorService.shutdown();}
}
现在,唯一感兴趣的点是消费者内部用于处理传入商品的ItemProcessor。 ItemProcessor的编码如下:
package com.maximus.consumer;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;public class ItemProcessor implements Runnable
{private BlockingQueue<Item> jobQueue;private volatile boolean keepProcessing;public ItemProcessor(BlockingQueue<Item> queue){jobQueue = queue;keepProcessing = true;}public void run(){while(keepProcessing || !jobQueue.isEmpty()){try{Item j = jobQueue.poll(10, TimeUnit.SECONDS);if(j != null){j.process();}}catch(InterruptedException ie){Thread.currentThread().interrupt();return;}}}public void cancelExecution(){this.keepProcessing = false;}
}
package com.maximus.consumer;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;public class Test
{public static void main(String[] args) throws Exception{Consumer consumer = new ConsumerImpl(10);BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(args[0]))));String line = "";while((line = br.readLine()) != null){System.out.println("Producer producing: " + line);consumer.consume(new PrintJob(line));}consumer.finishConsumption();}
}class PrintJob implements Item
{private String line;public PrintJob(String s){line = s;}public void process(){System.out.println(Thread.currentThread().getName() + " consuming :" + line);}
}
参考: The Java HotSpot博客上的JCG合作伙伴 Sarma Swaranga 解决了Java中的生产者-消费者问题 。
翻译自: https://www.javacodegeeks.com/2012/05/solving-producer-consumer-problem-in.html
用Java解决生产者-消费者问题相关推荐
- JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)
package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 惊!用Java实现生产者消费者问题能这么简单?
Java简单实现生产者消费者问题 单个消费者 今天结束了多线程的学习,使用wait和notify来进行线程间的通信以此实现简易的生产者消费者问题: 首先来看什么是生产者消费者问题: 所谓生产者-消费者 ...
- java实现生产者消费者模式
一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...
- 用管程解决生产者消费者问题
生产者消费者问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用. 生产者,消费者共享一个初始化为空,大小为n 的缓冲区. 如 ...
- 操作系统课设--使用信号量解决生产者/消费者同步问题
山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- 两种方式解决 生产者消费者问题
一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确 ...
- 用 wait-notify 写一段代码来解决生产者-消费者问题
用 wait-notify 写一段代码来解决生产者-消费者问题 参考文章: (1)用 wait-notify 写一段代码来解决生产者-消费者问题 (2)https://www.cnblogs.com/ ...
最新文章
- 单链表的基本操作(增删查总结)
- linux上使用FTP下载文件
- 项目(五)jumpserver企业开源跳板机搭建
- uniapp中使用picker_uniapp 使用个推推送系统消息
- 驱动利器:数据驱动下的产品决策(上)
- 聊聊Unity项目管理的那些事:Git-flow和Unity
- C语言项目:绽放的玫瑰花
- 数学建模4 论文写作排版和技巧
- jQuery easyui中combox 自定义样式 去掉下拉框的空白
- 《网络工程师考试 考前冲刺预测卷及考点解析》复习重点
- python千行代码项目_p2:千行代码入门python
- Hyperledger Fabric教程(3)-- byfn.sh分析-生成通道所需交易和文件
- matlab 简介_MATLAB简介
- C#Winform拓展控件之Panel
- C/C++中取地址符的语义
- 阿里巴巴校招内推一面总结
- PowerVR SDK
- 【CAD算法】【计算机图形学】Coons Patch曲面生成程序(python/numpy实现)[2]
- 第十六章:垃圾回收相关概念
- LaTeX--简易教程--论文写作神器
热门文章
- maven 版本号插件_测试Maven版本插件自动递增版本号
- spring 导出csv_Spring批处理CSV处理
- swarm 本地管理远程_带有WildFly Swarm的远程JMS
- hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名
- 如何在AWS中启动EC2实例
- Spring@懒惰注释
- 创建自定义Maven原型
- java反射教程_Java反射教程
- JRebel适用于Gradle Spring Boot应用程序
- JSON的JUnit Hamcrest Matcher