Worker-Thread设计模式
import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; public class Test { public static void main(String[] args){ ProductionChannelTest.test(); } } abstract class InstructionBook{ public final void create(){ this.firstProcess(); this.sedoncProcess(); } protected abstract void firstProcess(); protected abstract void sedoncProcess(); } class Production extends InstructionBook{ private final int prodID; public Production(int prodID) { this.prodID = prodID; } @Override protected void firstProcess() { System.out.println("execute the "+prodID+" first process"); } @Override protected void sedoncProcess() { System.out.println("execute the "+prodID+" second process"); } } class Worker extends Thread{ private final ProductionChannel channel; private final static Random random = new Random(System.currentTimeMillis()); public Worker(String name, ProductionChannel channel) { super(name); this.channel = channel; } @Override public void run() { while (true) { try{ Production production = channel.takeProduction(); System.out.println(getName()+" process the "+production); production.create(); TimeUnit.SECONDS.sleep(random.nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ProductionChannel{ private final static int MAX_PROD = 100; private final Production[] productionQueue; private int tail; //队列尾 private int head; //队列头 private int total; //当前流水有多少个待加工的产品 private final Worker[] workers; public ProductionChannel(int workSize) { this.workers=new Worker[workSize]; this.productionQueue=new Production[MAX_PROD]; for (int i = 0; i < workSize; i++) { workers[i]=new Worker("Worker-"+i,this); workers[i].start(); } } public void offerProduction(Production production){ synchronized (this) { while (total >= productionQueue.length) { try{ this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } productionQueue[tail]=production; tail=(tail+1)%productionQueue.length; total++; this.notifyAll(); } } public Production takeProduction(){ synchronized (this) { while (total <= 0) { try{ this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } Production production = productionQueue[head]; head = (head+1)%productionQueue.length; total--; this.notifyAll();; return production; } } class ProductionChannelTest{ public static void test(){ final ProductionChannel channel = new ProductionChannel(5); AtomicInteger productionNo = new AtomicInteger(); IntStream.range(1,8).forEach(i->new Thread(()->{ while(true){ channel.offerProduction(new Production(productionNo.getAndIncrement())); try{ TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } } }).start()); } }
Worker-Thread设计模式的更多相关文章
- 多线程 Worker Thread 模式
Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来. Work ...
- Worker Thread
http://www.codeproject.com/Articles/552/Using-Worker-Threads Introduction Worker threads are an eleg ...
- Simple Worker Thread Class
http://www.codeproject.com/Articles/36184/Simple-Worker-Thread-Class Introduction Many times we need ...
- 多线程系列之九:Worker Thread模式
一,Worker Thread模式 也叫ThreadPool(线程池模式) 二,示例程序 情景:一个工作车间有多个工人处理请求,客户可以向车间添加请求.请求类:Request定义了请求的信息和处理该请 ...
- Exception thrown on Scheduler.Worker thread. Add `onError` handling
<html> <head></head> <body> java.lang.IllegalStateException: Exception throw ...
- Scheduler & Task & Worker & Thread & Request & Session & Connection of SQL Server
MSSQL一直以来被人们认为简单.好学,但等到大家掌握了入门操作,深入理解起来又觉得非常的“拧巴”,尤其是对用惯了Oracle的同学来说,究其根本原因,无非是MSSQL引入和暴露了太多的概念.细节和理 ...
- Do waiting or suspended tasks tie up a worker thread?
https://blogs.msdn.microsoft.com/askjay/2012/07/29/do-waiting-or-suspended-tasks-tie-up-a-worker-t ...
- Mongodb之failed to create service entry worker thread
Mongodb "failed to create service entry worker thread" 错误. 系统:CentOS release 6.8 mongod.lo ...
- Worker Thread模式
工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来 5个工人线程从传送带取数据,3个传送工人线程将数据放入传送带 public class C ...
- Worker Thread等到工作来,来了就工作
Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来. Work ...
随机推荐
- 使用sklearn构建含有标量属性的决策树
网络上使用sklearn生成决策树的资料很多,这里主要说明遇见标量数据的处理. 经查验参考资料,sklearn并非使用了课上以及书上讲的ID3算法,而是选择了CART,该算法生成二叉树:scikit- ...
- 蚂蚁金服招聘-JAVA资深开发工程师/专家-蚂蚁金服保险
岗位描述: 1.协助业务方梳理业务需求,提供业务规划方案.架构设计方案: 2.负责业务系统的规划设计,制定产品的技术发展路线,完成重要业务模块及核心框架的搭建及编码实现: 3.发现和解决业务系统的技术 ...
- Android零基础入门第5节:善用ADT Bundle,轻松邂逅女神
原文:Android零基础入门第5节:善用ADT Bundle,轻松邂逅女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...
- Win10自带应用不喜欢?一条命令全部卸载
与Win8/Win8.1一样,Win10中继续内置了应用商店,所不同的是Windows10中已升级为通用应用商店,具有跨平台特性.可能有的朋友仍不喜欢使用Modern应用,因为传统桌面应用几乎能够满足 ...
- Linux ADF(Atomic Display Framework)浅析---概述
概述 因为工作关系,最近有涉及到ADF(Atomic Display Framework)相关的内容,部分内容来自互联网 ADF(Atomic Display Framework)是Google新增的 ...
- delphi 获取当前进程的cpu占用率
type TProcessCpuUsage = record private FLastUsed, FLastTime: Int64; FCpuCount:Integer; publ ...
- Qt5图形视图框架的“俄罗斯方块”(使用了QGraphicsView)
Qt5 图形视图框架QGraphicsView 1.图形视图框架包含三大类:场景类(QGraphicsScene),视图类(QGraphicsView),图元类(QGraphicsItem): 2.对 ...
- IIS6.0 WEB园配置
为应用程序池创建 Web 园请注意以下几点: 一.每一个工作进程都会消耗系统资源和CPU占用率:太多的工作进程会导致系统资源和CPU利用率的急剧消耗: 二.每一个工作进程都具有自己的状态数据,如果We ...
- python代码检查工具pylint 让你的python更规范
1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅 ...
- 如何用 Flutter 实现混合开发?闲鱼公开源代码实例
Flutter: 必火,转两篇软文预热哈哈~ 中文网: https://flutterchina.club/get-started/test-drive/ 如何用 Flutter 实现混合开发?闲鱼公 ...