Worker Thread设计模式
来源:互联网 发布:linux 安装jdk gz文件 编辑:程序博客网 时间:2024/06/05 14:26
Worker Thread模式的基本思路是,有一个流水线(channel),客户端不断的把任务(request)放到其中,当有任务时,工作线程(worker)就执行任务,否则等待任务。
下面对这个模式简单实现
首先定义request类
public class Request { private final String name; private final int number; public Request(String name, int number) { this.name = name; this.number = number; } public void execute() { System.out.println(Thread.currentThread().getName() + " execute Request" + this.name + ", number is " + number); }}
Request类有name和number属性。还有一个execute方法,决定了worker怎么去执行任务。
定义channel类
public class Channel { private final int MAX_SIZE = 100; private final Request[] requests; private int head; private int tail; private int count; private final Worker[] workers; public Channel(int workers) { this.requests = new Request[MAX_SIZE]; this.head = 0; this.tail = 0; this.count = 0; this.workers = new Worker[workers]; init(); } private void init() { for (int i = 0; i < workers.length; i++) { workers[i] = new Worker("Worker-" + i, this); } } public void startWorkers() { Arrays.asList(workers).forEach(Worker::start); } public synchronized void put(Request request) { while (count >= requests.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } requests[tail] = request; tail = (tail + 1) % requests.length; count++; this.notifyAll(); } public synchronized Request take() { while (count <= 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Request request = requests[head]; head = (head + 1) % requests.length; count--; this.notifyAll(); return request; }}
定义了一个队列,包含了任务和执行任务的worker,并在构造函数中初始化worker。还有put和take方法,用于向对类中放和取任务。put方法将任务放到队尾,take方法将任务放到对头。
定义worker
public class Worker extends Thread { private Channel channel; private static final Random random = new Random(System.currentTimeMillis()); public Worker(String name, Channel channel) { super(name); this.channel = channel; } @Override public void run() { while (true) { Request request = channel.take(); request.execute(); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } }}
worker继承thread,其任务就是不断的从channel的队列中获取request并执行
模拟向channel中不断放入任务
public class Transport extends Thread { private final Channel channel; private static final Random random = new Random(System.currentTimeMillis()); public Transport(String name, Channel channel) { super(name); this.channel = channel; } @Override public void run() { for (int i = 0; true; i++) { Request request = new Request(getName(), i); channel.put(request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } }}
不断构造request放入channel
测试
public class Client { public static void main(String[] args) { final Channel channel = new Channel(5); channel.startWorkers(); new Transport("t1", channel).start(); new Transport("t2", channel).start(); new Transport("t3", channel).start(); }}
结果
Worker-3 execute Requestt2, number is 0Worker-2 execute Requestt3, number is 0Worker-4 execute Requestt1, number is 0Worker-0 execute Requestt2, number is 1Worker-1 execute Requestt2, number is 2Worker-4 execute Requestt2, number is 3Worker-0 execute Requestt2, number is 4Worker-2 execute Requestt3, number is 1Worker-3 execute Requestt1, number is 1Worker-0 execute Requestt3, number is 2Worker-1 execute Requestt1, number is 2Worker-2 execute Requestt2, number is 5Worker-4 execute Requestt2, number is 6Worker-4 execute Requestt3, number is 3Worker-3 execute Requestt3, number is 4Worker-2 execute Requestt3, number is 5Worker-2 execute Requestt1, number is 3Worker-1 execute Requestt2, number is 7Worker-0 execute Requestt3, number is 6Worker-1 execute Requestt2, number is 8Worker-3 execute Requestt3, number is 7Worker-4 execute Requestt1, number is 4Worker-1 execute Requestt2, number is 9Worker-0 execute Requestt1, number is 5Worker-3 execute Requestt3, number is 8Worker-4 execute Requestt3, number is 9Worker-3 execute Requestt1, number is 6Worker-0 execute Requestt3, number is 10Worker-2 execute Requestt2, number is 10Worker-1 execute Requestt2, number is 11Worker-2 execute Requestt1, number is 7Worker-4 execute Requestt2, number is 12Worker-2 execute Requestt1, number is 8Worker-3 execute Requestt3, number is 11Worker-3 execute Requestt2, number is 13Worker-4 execute Requestt2, number is 14Worker-1 execute Requestt2, number is 15...
阅读全文
0 0
- Worker Thread设计模式
- Worker Thread 模式
- Worker Thread 模式
- 《java多线程设计模式 第八章Worker Thread》
- java多线程设计模式Worker Thread(线程池)
- Design Pattern: Worker Thread 模式
- Java Worker 设计模式
- Java Worker 设计模式
- Master-Worker设计模式
- Master-Worker设计模式
- 并行设计模式-Master/Worker
- 并行设计模式-Master/Worker
- Master worker并行设计模式
- worker thread
- 多线程设计模式-- Master-Worker模式
- 并发设计模式之Master-Worker模式
- Master-Worker模式 多线程设计模式
- Worker Thread & UserInterface Thread
- Paint 详解
- 模拟移动端上拉加载功能
- 归并排序
- 一名转专业到计算机的分析
- [LeetCode] Dungeon Game
- Worker Thread设计模式
- 初学python前言
- 每日一道算法题——矩形覆盖
- 值得推荐的C/C++框架和库
- 详细的Log4j使用教程
- 快速排序的C语言实现
- 研究生互联网企业面试刷题信息渠道
- 2015-11-30-java-tomcat连接mySql数据库
- 记一次函数崩溃的现象分析,stack around the variable…was corrupted