`

Worker Pattern(四)

阅读更多
最后,Main负责完成main()方法:

package com.crackj2ee.thread;
public class Main {
    public static void main(String[] args) {
        TaskQueue queue = new TaskQueue();
        ThreadPool pool = new ThreadPool(queue);
        for(int i=0; i<10; i++) {
            queue.putTask(new CalculateTask());
            queue.putTask(new TimerTask());
        }
        pool.addWorkerThread();
        pool.addWorkerThread();
        doSleep(8000);
        pool.currentStatus();
        pool.addWorkerThread();
        pool.addWorkerThread();
        pool.addWorkerThread();
        pool.addWorkerThread();
        pool.addWorkerThread();
        doSleep(5000);
        pool.currentStatus();
    }
    private static void doSleep(long ms) {
        try {
            Thread.sleep(ms);
        }
        catch(InterruptedException ie) {}
    }
}

main()一开始放入了20个Task,然后动态添加了一些服务线程,并定期打印线程状态,运行结果如下:

worker-0 start.
[CalculateTask 0] start...
worker-1 start.
[TimerTask 0] start...
[TimerTask 0] done.
[CalculateTask 1] start...
[CalculateTask 0] done.
[TimerTask 1] start...
[CalculateTask 1] done.
[CalculateTask 2] start...
[TimerTask 1] done.
[TimerTask 2] start...
[TimerTask 2] done.
[CalculateTask 3] start...
-----------------------------------------------
Thread count = 2
worker-0: busy
worker-1: busy
-----------------------------------------------
[CalculateTask 2] done.
[TimerTask 3] start...
worker-2 start.
[CalculateTask 4] start...
worker-3 start.
[TimerTask 4] start...
worker-4 start.
[CalculateTask 5] start...
worker-5 start.
[TimerTask 5] start...
worker-6 start.
[CalculateTask 6] start...
[CalculateTask 3] done.
[TimerTask 6] start...
[TimerTask 3] done.
[CalculateTask 7] start...
[TimerTask 4] done.
[TimerTask 7] start...
[TimerTask 5] done.
[CalculateTask 8] start...
[CalculateTask 4] done.
[TimerTask 8] start...
[CalculateTask 5] done.
[CalculateTask 9] start...
[CalculateTask 6] done.
[TimerTask 9] start...
[TimerTask 6] done.
[TimerTask 7] done.
-----------------------------------------------
Thread count = 7
worker-0: idle
worker-1: busy
worker-2: busy
worker-3: idle
worker-4: busy
worker-5: busy
worker-6: busy
-----------------------------------------------
[CalculateTask 7] done.
[CalculateTask 8] done.
[TimerTask 8] done.
[TimerTask 9] done.
[CalculateTask 9] done.

仔细观察:一开始只有两个服务器线程,因此线程状态都是忙,后来线程数增多,7个线程中的两个状态变成idle,说明处于wait()状态。

思考:本例的线程调度算法其实根本没有,因为这个应用是围绕TaskQueue设计的,不是以Thread Pool为中心设计的。因此,Task调度取决于TaskQueue的getTask()方法,你可以改进这个方法,例如使用优先队列,使优先级高的任务先被执行。

如果所有的服务器线程都处于busy状态,则说明任务繁忙,TaskQueue的队列越来越长,最终会导致服务器内存耗尽。因此,可以限制TaskQueue的等待任务数,超过最大长度就拒绝处理。许多Web服务器在用户请求繁忙时就会拒绝用户:HTTP 503 SERVICE UNAVAILABLE
分享到:
评论

相关推荐

    pdfJS和pdf.worker

    兼容IE的JS在线预览pdf(pdfjs和pdf.worker)

    master_worker_pattern:主工人模式演示

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

    pdf.js和pdf.worker.js html打开pdf所需要的js

    PDF.js和PDF.Worker.js是Mozilla开发的开源库,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这两个JavaScript文件是实现HTML页面加载和显示PDF的关键组件,提供了纯JavaScript解决方案来处理PDF文档。 PDF.js...

    Laravel开发-elegant-laravel-worker

    8. **代码结构与设计模式**:"elegant-laravel-worker"可能采用了设计模式如观察者模式(Observer Pattern)来实现信号监听,以及策略模式(Strategy Pattern)来处理不同类型的停止逻辑。 9. **配置与部署**:部署...

    Pattern-Oriented Software Architecture V2

    - **工作池模式(Worker Pool Pattern)**:预先创建一组线程来执行任务,从而减少线程创建和销毁的成本。 #### 应用场景 - **并发系统**:在多核处理器环境下构建高并发应用程序。 - **分布式系统**:在网络环境中...

    java多线程设计模式

    - 在多线程编程中,Worker Pattern 是一种常见的设计模式,通常用于处理任务队列。 - 一个或多个 Worker 线程不断检查任务队列,一旦发现新任务,就立即处理。 - 这种模式常用于服务器应用程序,如网络服务,因为...

    良葛格DesignPattern学习笔记

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

    service-worker-router:for适合服务人员的优雅而快速的URL路由器(可独立使用)

    它也使用而不是url-pattern ,因为我发现它使用起来更直观。 我建议将新路由器用于新项目。服务工作者路由器 适合服务人员的优雅而快速的URL路由器(可独立使用)还有另一台路由器? :grinning_face_with_smiling_...

    C++factory pattern

    员工类通常包含了一些通用的方法,比如工作(work)等,而具体的员工类型(如Manager、Worker)会继承这个接口并实现其具体行为。 3. **employee.cpp**:这个源文件可能包含了员工类的具体实现,比如`Employee`的...

    Migration-worker-details

    9. `pattern`属性:用于设置输入验证规则,如邮箱格式或电话号码格式。 在"Migration-worker-details-main"文件中,可能包含这个HTML表单的源代码,以及可能的CSS(Cascading Style Sheets)和JavaScript文件,它们...

    基于事件的异步模式(C#源码)

    本主题聚焦于C#中的“基于事件的异步模式”(Event-based Asynchronous Pattern, EAP),这是一种为用户界面(UI)应用程序设计的异步编程模型。下面我们将深入探讨这一模式以及与之相关的多线程、委托和源码实现。 ...

    支持JSP重要

    &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt; &lt;url-pattern&gt;*.jspx&lt;/url-pattern&gt; ``` 2. **配置server.xml**:在Tomcat的主配置文件`conf/server.xml`中,你需要确保`Host`元素配置了正确的目录结构,特别是`appBase`属性...

    custom-coredump:自定义Linux系统的core_pattern和coredump实用程序

    自定义Linux系统的core_pattern和coredump实用程序 在K8S集群中的workernode上应用自定义核心转储 将custom-coredump-01.tar.gz复制到K8S主节点,然后执行以下操作 #tar -zcvf custom-coredump-01.tar.gz #cd脚本#...

    test_pat_sync_worker___27

    这个缩写可能有很多含义,但在编程上下文中,它可能指代 "Pattern"(模式)、"Programmer's Algorithm Test"(程序员算法测试)或其他某种特定的编程技术。如果 PAT 是一个特定的库或工具,那么它可能与特定的编程...

    使用serviceworkers让你的Nextjs应用程序能够离线工作

    Service Worker 是一种在浏览器后台运行的脚本,它允许开发者拦截和处理网络请求,从而实现离线缓存、消息推送等功能。在 Next.js 应用程序中集成 Service Worker,可以显著提升用户体验,尤其是在网络条件不稳定...

    linux_apache+tomcat负载均衡安装和调试.pdf

    &lt;url-pattern&gt;/*&lt;/url-pattern&gt; ``` 并确保 CSRFFilter 类正确实现了过滤逻辑。 总结,通过以上步骤,我们可以成功地在 Linux 上安装并配置 Apache、Tomcat 和 mod_jk,实现负载均衡。这不仅可以提高系统的可用性...

    java 子线程通过观察者模式通知主线程

    而观察者模式(Observer Pattern)则是一种设计模式,它允许一个对象的状态变化自动通知其他依赖该对象的对象。在多线程环境下,观察者模式可以被巧妙地应用于子线程通知主线程的情况。 观察者模式的核心思想是定义...

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

    以下是对这个"Example-TypeScript-Singleton-Pattern"项目的详细解析。 1. **TypeScript 基础知识**: TypeScript 是 JavaScript 的超集,提供了静态类型系统、接口、类、枚举等特性,增强了代码的可维护性和...

    collider:加速主义者罗盘的未来发电机

    基本格式为: # pattern_namevalue avalue {sub_pattern}# sub_patternbc得出value a , value b或value c 。 有关更全面的示例,请参见terms.txt 。 随时打开PR添加更多条款! 然后运行python main.py示例输出...

Global site tag (gtag.js) - Google Analytics