`

Design Pattern: Worker Thread 模式

    博客分类:
  • J2SE
阅读更多

Worker Thread模式在Request的管理上像是 Producer Consumer 模式,在Request的行为上像是 Command 模式

Producer Consumer模式专注于Product的生产与消费,至于Product被消费时是作何处理,则不在它的讨论范围之中。 如果您的Product是一个Request,消费者取得Request之后,执行Request中指定的请求方法,也就是使用Command模式,并且您的Request缓冲区还管理了Consumer,就有Worker Thread模式的意思了。在Sequence Diagram上,可以看出Worker Thread同时展现了Producer Consumer模式与Command模式:

利用Java实现的一个Channel类如下所示:

  • Channel.java
import java.util.LinkedList; 

public class Channel { 
    private LinkedList requests; 
    private WorkerThread[] workerThreads; 

    public Channel(int threadNumber) { 
        requests = new LinkedList(); 
        workerThreads = new WorkerThread[threadNumber]; 
        for(int i = 0; i < workerThreads.size(); i++) { 
            workerThreads[i] = new WorkerThread(); 
           workerThreads[i].start(); 
        } 
    } 

    public synchronized void putRequest(Request request) { 
        while(requests.size() >= 2) { // 容量限制为 2 
            try { 
                wait(); 
            } 
            catch(InterruptedException e) {} 
        } 

        requests.addLast(request); 
        notifyAll(); 
    } 
    
    public synchronized Request getProduct() { 
        while(requests.size() <= 0) { 
            try { 
                wait(); 
            } 
            catch(InterruptedException e) {} 
        } 

        Request request = (Request) requests.removeFirst(); 
        notifyAll(); 
      
        return request;
    } 
} 


Request类与WorkerThread类之间采的Command模式:

  • Request.java
public class Request() { 
    // .... 

    public void execute() { 
        // do some work.... 
    } 
} 

 

  • WorkerThread.java
public class WorkerThread extends Thread { 
    // ... 

    public void run() { 
        while(true) { 
            Request request = channel.getRequest(); 
            request.execute(); 
        } 
    } 
} 


就行为上,WorkerThread就是有请求来了就作,如果没有请求,则所有的WorkerThread就等待,直到有新的工作进来而通知它们,取得请求的WorkerThread要作的工作,就直接定义在execute()中。

分享到:
评论

相关推荐

    master_worker_pattern:主工人模式演示

    Master-Worker是一个很好用的设计模式, 它可以把一个大工作分成很多小工作去执行, 等所有小工作都回来以后, 将所有的小工作结果做一个统整, 得到最终结果, 就很像专题小组有五个人, 把系统分成四等分, 每个人负责一...

    线程示例WorkerThread_demo

    `WorkerThread_demo`是一个典型的线程应用示例,它可能是为了展示如何在C#环境中创建和管理后台工作线程,以实现非阻塞的UI交互。下面我们将详细探讨线程的概念,`WorkerThread`类的设计,以及可能的实现方式。 ...

    RuntimeError: DataLoader worker (pid(s) 9528, 8320) exited unexpectedly

    RuntimeError: DataLoader worker (pid(s) 9528, 8320) exited unexpectedly 去网上搜教程,说是在loader定义的时候多进程的参数指定的问题,我的loader定义如下 loader = Data.DataLoader( dataset=torch_dataset,...

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

    Apache2 的 Worker 工作模式配置及 MaxClients 不足问题解决 Apache 服务器是当前最流行的 Web 服务器之一,它提供了多种工作模式,包括 Prefork、Worker 和 Event 等。其中,Worker 工作模式是 Apache 2.x 版本中...

    书中的 std::thread

    std::thread t1(worker, std::ref(m)), t2(worker, std::ref(m)); t1.join(); t2.join(); return 0; } ``` 3. **线程局部存储**:每个线程都有自己的内存空间,可以用来存储特定于线程的数据。`std::thread_...

    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 { .....

    基于Springboot+thymeleaf酒店宾馆管理系统

    项目简介 springboot酒店宾馆管理系统 本系统共分为三个角色:系统管理员、工作人员、前台人员该...前台人员:sever1 密码:worker1 项目技术 后端:Springboot、Mybatis、Mysql 前端:html、thymeleaf、jquery、layui

    after:Worker + Layim + TP5简单客服系统

    Worker + Layim + TP5简单客服系统 实现了功能: 1,可通过后台对聊天成员的增删改查2,实现了离线客服登录后聊天记录推送3,实现了表情和图片的发送4,实现了一对一聊天和聊天记录的查看5,实现了在线状态显示 注意...

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

    Example-TypeScript-Singleton-Pattern:TypeScript 和单例模式

    在 TypeScript 或 JavaScript 中,由于它们通常运行在单线程环境中,这个问题通常不需要考虑,但在服务器端如 Node.js 的集群模式或Web Worker中,可能需要额外的同步机制。 9. **注意事项**: 尽管单例模式在很多...

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

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

    WorkerThread_Vc_

    本示例"WorkerThread_Vc_"提供了一种创建和管理Worker线程的方法,包括如何启动线程、传递参数以及与主线程进行通信。 首先,要创建一个线程,我们需要定义一个函数,这个函数将在新线程中运行,我们通常称之为线程...

    thread.js::thread:使Web Worker和Worker线程像函数调用一样简单

    使用一个统一的API将CPU密集型任务卸载到node.js,Web浏览器和... 您可以在上找到thread.js的旧版本0.12。 此页面上的所有内容均引用1.0版,该版本是使用全新API重写的库。 安装 npm install threads tiny-worker

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

    当面对高并发访问时,为了提升系统性能和可用性,我们可以采用负载均衡策略,其中"worker模式"是Apache mod_proxy模块的一种配置方式,用于实现对后端Tomcat服务器的负载均衡。 Apache的mod_proxy模块允许我们配置...

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

    prefork 模式更适合内存有限且需要高度稳定性的环境,而 worker 模式则适用于需要处理大量并发请求且所有模块都线程安全的情况。但请注意,不是所有 PHP 模块都支持线程安全,因此在使用 worker 模式时需要额外注意...

    worker-runner:Worker Runner是协助使用Web Worker的工具

    工人赛跑者 Worker Runner是协助使用Web Worker的工具。目录初始化用所需的方法声明您的类。 export class LibraryRunner { // Example Runner public books : string [ ] constructor ( books : string [ ] ) { // ...

    zookeeper实战:SingleWorker代码样例

    在这个"zookeeper实战:SingleWorker代码样例"中,我们将深入探讨如何使用ZooKeeper实现一个简单的SingleWorker模式,以及涉及的相关源码和工具。 首先,SingleWorker模式是ZooKeeper中常见的应用场景之一,常用于...

    workerman-doc:worker + gateway源码阅读

    原始码workerman +网关worker元数据解读。为什么为什么要出这样的文章。原因是最近在项目中用到workerman + gateway worker。但苦于国内这块的资源太少了。所以就有了这个地方来存储我阅读workerman + gateway ...

    Exemplo-Manager Worker Thread System.pdf

    ### Manager Worker Thread System 在《Exemplo-Manager Worker Thread System.pdf》文档中,我们深入了解了一个基于Delphi的多线程系统的设计与实现方法。本文档不仅适用于Delphi开发者,也适用于那些希望了解如何...

Global site tag (gtag.js) - Google Analytics