`

java worker thread模式

阅读更多

转两个帖子

一个java worker thread例子http://blog.csdn.net/derekjiang/article/details/5204090

另一个java worker thread的讲解http://blog.csdn.net/derekjiang/article/details/5204090

 

 

Worker Thread Pattern的参与者:

1. Client(委托人)参与者

    Client参与者会建立Request参与者,并传给Channel参与者。

2. Channel(通路)参与者

    Channel参与者会从Client参与者获取Request参与者,传递给Worker参与者。

3. Worker(工人)参与者

    Worker参与者会从Channel参与者获取Request参与者,并执行这份工作。当工作结束之后,会去拿下一个Request参与者。

4. Request(请求)参与者

    Reqeust参与者用来表示工作。Request参与者会存放执行这份工作所需要的数据。

---------------------------------------------

控制承载量:

Worker参与者的数量是可以自由设置的。提高Worker参与者的数量,可以提高并发处理的工作量。但是如果准备的Worker参与者数量比同时间的工作量来的多,有些Worker参与者也派不上用场,没活干,还会占用内存。所以有必要配合实际软件使用的需要来调整Worker参与者的数量。

---------------------------------------------

Invocation与execution的分离:

Client参与者会发出工作请求,工作的内容以Request的形式包装起来,传递个Channel参与者。这个过程,对应于普通的方法调用来说,就相当于“评估自变量,启动方法”的操作。

另一方面,Worker参与者会使用从Channel参与者拿来的Request参与者,进行实际的操作。这个过程,对应于普通的方法调用来说,可以对应到“执行方法”的部分。

普通的方法调用的操作,“启动方法”和“执行方法”是连续进行的。当一个方法一经调用,就会马上继续执行,启动和执行是密不可分的。

在Worker Thread Pattern中,实现了“启动方法”和“执行方法”的分离。这样的好处有:

1. 提高响应性。

invocation可以继续自己前进,不用等待execution,这样能提高程序的响应性。

2. 控制实行顺序。

invocation和execution分离,execute的顺序就可以与invoke的次序无关,也就是说,我们可以对Request参与者设立优先级,控制Channel参与者传递Request给Worker参与者的顺序。

3. 可以取消和重复执行。

如果能将invocation和execution分离,那么就能做到在execute之前,把已经invoke的请求的execution取消掉。

同样,只要把Request参与者保存下来,就可以重复执行。

4. 分散处理的第一步

因为invocation和execution分离了,所以invoke和execute的操作也比较容易拆开在不同的计算机上面执行,相当于Reqeust参与者的对象,可以通过网络传送的另外一台计算机上。

------------------------------------------------

多态的Request参与者:

因为WorkerThread参与者只不过是单纯的接收Request的实例,调用Request的execute方法,

那么当我们建立Request类的子类,并将其传递给Channel,WorkerThread也应该能够正确的处理。

执行工作所需要的所有信息,都定义在Request参与者里。所以即使建立出多态的Request参与者,增加工作的种类,Channel参与者和Worker参与者都不需要进行任何修改。

------------------------------------------

实例:

Java代码  收藏代码
  1. public class Request {  
  2.     private final String name; //  委托者  
  3.     private final int number;  // 请求编号  
  4.     private static final Random random = new Random();  
  5.     public Request(String name, int number) {  
  6.         this.name = name;  
  7.         this.number = number;  
  8.     }  
  9.     public void execute() {  
  10.         System.out.println(Thread.currentThread().getName() + " executes " + this);  
  11.         try {  
  12.             Thread.sleep(random.nextInt(1000));  
  13.         } catch (InterruptedException e) {  
  14.         }  
  15.     }  
  16.     public String toString() {  
  17.         return "[ Request from " + name + " No." + number + " ]";  
  18.     }  
  19. }  

 

 

 

Java代码  收藏代码
  1. public class ClientThread extends Thread {  
  2.     private final Channel channel;  
  3.     private static final Random random = new Random();  
  4.     public ClientThread(String name, Channel channel) {  
  5.         super(name);  
  6.         this.channel = channel;  
  7.     }  
  8.     public void run() {  
  9.         try {  
  10.             for (int i = 0true; i++) {  
  11.                 Request request = new Request(getName(), i);  
  12.                 channel.putRequest(request);  
  13.                 Thread.sleep(random.nextInt(1000));  
  14.             }  
  15.         } catch (InterruptedException e) {  
  16.         }  
  17.     }  
  18. }  

 

 

 

Java代码  收藏代码
  1. public class WorkerThread extends Thread {  
  2.     private final Channel channel;  
  3.     public WorkerThread(String name, Channel channel) {  
  4.         super(name);  
  5.         this.channel = channel;  
  6.     }  
  7.     public void run() {  
  8.         while (true) {  
  9.             Request request = channel.takeRequest();  
  10.             request.execute();  
  11.         }  
  12.     }  
  13. }  

 

 

Java代码  收藏代码
  1. public class Channel {  
  2.     private static final int MAX_REQUEST = 100;  
  3.     private final Request[] requestQueue;  
  4.     private int tail;  // 下一个putRequest的地方  
  5.     private int head;  // 下一个takeRequest的地方  
  6.     private int count; // Request的数量  
  7.   
  8.     private final WorkerThread[] threadPool;  
  9.   
  10.     public Channel(int threads) {  
  11.         this.requestQueue = new Request[MAX_REQUEST];  
  12.         this.head = 0;  
  13.         this.tail = 0;  
  14.         this.count = 0;  
  15.   
  16.         threadPool = new WorkerThread[threads];  
  17.         for (int i = 0; i < threadPool.length; i++) {  
  18.             threadPool[i] = new WorkerThread("Worker-" + i, this);  
  19.         }  
  20.     }  
  21.     public void startWorkers() {  
  22.         for (int i = 0; i < threadPool.length; i++) {  
  23.             threadPool[i].start();  
  24.         }  
  25.     }  
  26.     public synchronized void putRequest(Request request) {  
  27.         while (count >= requestQueue.length) {  
  28.             try {  
  29.                 wait();  
  30.             } catch (InterruptedException e) {  
  31.             }  
  32.         }  
  33.         requestQueue[tail] = request;  
  34.         tail = (tail + 1) % requestQueue.length;  
  35.         count++;  
  36.         notifyAll();  
  37.     }  
  38.     public synchronized Request takeRequest() {  
  39.         while (count <= 0) {  
  40.             try {  
  41.                 wait();  
  42.             } catch (InterruptedException e) {  
  43.             }  
  44.         }  
  45.         Request request = requestQueue[head];  
  46.         head = (head + 1) % requestQueue.length;  
  47.         count--;  
  48.         notifyAll();  
  49.         return request;  
  50.     }  
  51. }  

 

 

Java代码  收藏代码
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         Channel channel = new Channel(5);   // 工人线程的數量  
  4.         channel.startWorkers();  
  5.         new ClientThread("Alice", channel).start();  
  6.         new ClientThread("Bobby", channel).start();  
  7.         new ClientThread("Chris", channel).start();  
  8.     }  
  9. }  
分享到:
评论

相关推荐

    线程示例WorkerThread_demo

    线程示例WorkerThread_demo,线程示例WorkerThread_demo, 线程示例WorkerThread_demo,

    C#建立WorkerThread

    WorkerThread线程实例,C#建立WorkerThread "工作者线程"的例子,代码中已定义工作者线程中调用的公用委托,建立事件标识,用于停止线程,建立委托实例,用于调用接口函数,自定义了一个工作者线程处理函数,若停止...

    Android代码-mainthread和WorkerThread线程之间的通信助手库

    AndroidChannel is helper library for inter thread communication between main thread and worker thread. AndroidChannel uses HandlerThread for inter thread communication. Setup Gradle dependencies { .....

    apache2的worker工作模式配置及MaxClients不足问题解决

    apache2的worker工作模式配置及MaxClients不足问题解决

    java多线程设计模式 (PDF中文版, 附源码)

    第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active...

    java多线程设计模式详解(PDF及源码)

    去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...

    Exemplo-Manager Worker Thread System.pdf

    Exemplo-Manager Worker Thread System.pdf

    36种最新设计模式整理

    36种最新设计模式整理 Design Pattern: Simple Factory 模式 ... Worker Thread 模式 Thread-Per-Message 模式 Future 模式 Read-Write-Lock 模式 Two-phase Termination 模式 Thread-Specific Storage 模式

    Apache的prefork模式和worker模式该户.docx

    Apache的prefork模式和worker模式该户.docx

    WorkerThread_Vc_

    VC++ 创建Worker线程实例源码,演示了如何创建线程,启动线程,设置线程参数,并向主线程窗体发送消息等

    swing-worker-1.1.jar

    Exceptionin thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/jdesktop/swingworker/SwingWorker at com.android.draw9patch.Application$1.run(Application.java:48) at java.awt.event....

    tp5.1+GatewayWorker 修复GatewayWorker在windows启动问题

    命令php think worker:gateway在windows下运行...根据GatewayWorker-for-win提供的demo修改的 本资源依赖GatewayWorker扩展,请先安装扩展。 使用方法,把解压后的文件夹放到项目根目录,双击start_for_win.bat,启动

    apache + tomcat 负载均衡worker模式初探

    NULL 博文链接:https://javacunyin.iteye.com/blog/1717950

    深入理解apahce的工作模式perfork、worker

    worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器 上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MP

    nextjs-worker-example:这是Webpack使用Next.js加载Web Worker的示例

    NextJS Worker示例这是使Web Worker在NextJS项目中运行的示例。 要使用worker-loader将Web Worker加载到NextJS站点上,并允许在其worker上运行babel等webpack加载器,必须覆盖构建输出路径。 感谢。 // next.config....

    java多线程设计模式

    java多线程设计模式 线程的创建和重起 线程的同步 wait/notify/sleep机制 Worker Pattern

    Apache的fork模式和worker模式判断方法

    运行命令httpd -l 或者apache2 -l ,输出的结果中如果含有prefork.c,那就是prefork模式,如果结果中含有worker.c,那就是worker模式。 知道模式之后我们可以在apache的confextrahttpd-mpm.conf 进行编辑了 # # ...

    Java多线程详解

    Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...

    gif.worker.js

    gif.worker.js js的多张图片转成gif的插件

    Web Worker版调用Face-Api.js

    webworker封装调用face-api.js

Global site tag (gtag.js) - Google Analytics