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 ...
随机推荐
- 微信小程序把玩(十三)progress组件
原文:微信小程序把玩(十三)progress组件 进度条描述的是一种加载的状态,比如软件升级下载进度, 视频,图片下载进度- 主要属性: wxml <progress percent=" ...
- 解决手机提示TF卡受损需要格式化问题
昨晚因为上QQ FOR PAD后.关机.结果又杯具了.上次无意看到一个SD卡修复命令,收藏起来了.一试,还真管用.现把它写出来.分享给大家.以后出现SD卡受损,千万不要再格式化内存卡了.修复过程:1. ...
- C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面 ...
- java多线程之wait和notify
多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作. java在Object类中就设计了wait()和notify()两个方法,以解决这个问题. 1.释义: wait()方法将 ...
- c#两种方式调用google地球,调用COM API以及调用GEPLUGIN 与js交互,加载kml文件,dae文件。将二维高德地图覆盖到到三维谷歌地球表面。
网络上资源很多不全面,自己在开发的时候走了不少弯路,在这里整理了最全面的google全套开发,COM交互,web端交互.封装好了各种模块功能. 直接就可以调用. 第一种方式:调用COMAPI实现调用g ...
- 系列教程 - java web开发
代码之间工作室持续推出Java Web开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢java的朋友们学习进步: java web 开发教程(1) - 开发环境搭建 技术交流QQ群: 商务合作 ...
- 【练习题】proj2 字符串压缩
输入一个字符串,输出简单的压缩 1)单字符串压缩 : 输入:ABBBCCD , 输出AB3C2D 2)多字符串压缩 输入:AABCABCD,输出A(ABC)2D 1)压缩单个字符 #include & ...
- tomcat实现
转载地址:https://blog.csdn.net/u014795347/article/details/52328221?locationNum=2&fps=1 以下代码纯属本人复制,而且 ...
- linux下svn安装
1.环境centos6.4 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve -d -r /www/sv ...
- JS 数据类型分析及字符串的方法
1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算 xxx ...