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 ...
随机推荐
- GIS基础软件及操作(五)
原文 GIS基础软件及操作(五) 练习五.空间分析的基本操作 空间分析的基本操作 空间分析模块 空间分析是基于地理对象的位置和形态的空间数据的分析技术,其目的在于提取和传输空间信息.空间分析是地理信息 ...
- GRPC 1.3.4 发布,Google 高性能 RPC 框架(Java C++ Go)
GRPC 1.3.4 发布了,GRPC 是一个高性能.开源.通用的 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架. GRPC ...
- MIPS开发板的“不二”选择——Creator Ci20单板计算机评测(芯片是君正JZ4780 ,也就是MIPS R3000,系统推荐Debian或深度,官网就有,其它语言有FreePascal和Go和Java和Python)
在MIPS架构的CPU上开发软件,当然需要使用MIPS专用的工具链来编译代码.不过一般的LINUX发行版内都有相应的配套工具链供用户使用.Ci20出厂时的LINUX发行版为DEBIAN 7.5,相应的 ...
- 改善C#程序的建议6:在线程同步中使用信号量
原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两 ...
- Collection was modified; enumeration operation may not execute.的异常处理
Collection was modified; enumeration operation may not execute.的异常处理 在运行程序时遇到这样一段异常,仔细检查后发现是使用Foreac ...
- C#字符串类型
C#字符串类型(string)是一种引用类型,是System.String的别名,表示Unicode字符串. 两种表示方法: 1.“C#” 直接用双引号括起来. 2.使用@,@“c:\test”,可以 ...
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...
- 实现js与Qt程序的交互(使用QtWebkit)
在QtWebkit的javascript里访问QObject的最关键的关键就是下面这个方法: void QWebFrame::addToJavaScriptWindowObject ( const Q ...
- 【spring boot】application.properties官方完整文档
官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...
- Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决
Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException : SQLSTATE[42000]: ...