终于到了真正的WorkerThread,这是真正执行任务的服务器线程:
package com.crackj2ee.thread;
public class WorkerThread extends Thread {
private static int count = 0;
private boolean busy = false;
private boolean stop = false;
private TaskQueue queue;
public WorkerThread(ThreadGroup group, TaskQueue queue) {
super(group, "worker-" + count);
count++;
this.queue = queue;
}
public void shutdown() {
stop = true;
this.interrupt();
try {
this.join();
}
catch(InterruptedException ie) {}
}
public boolean isIdle() {
return !busy;
}
public void run() {
System.out.println(getName() + " start.");
while(!stop) {
Task task = queue.getTask();
if(task!=null) {
busy = true;
task.execute();
busy = false;
}
}
System.out.println(getName() + " end.");
}
}
前面已经讲过,queue.getTask()是一个阻塞方法,服务器线程可能在此wait()一段时间。此外,WorkerThread还有一个shutdown方法,用于安全结束线程。
最后是ThreadPool,负责管理所有的服务器线程,还可以动态增加和减少线程数:
package com.crackj2ee.thread;
import java.util.*;
public class ThreadPool extends ThreadGroup {
private List threads = new LinkedList();
private TaskQueue queue;
public ThreadPool(TaskQueue queue) {
super("Thread-Pool");
this.queue = queue;
}
public synchronized void addWorkerThread() {
Thread t = new WorkerThread(this, queue);
threads.add(t);
t.start();
}
public synchronized void removeWorkerThread() {
if(threads.size()>0) {
WorkerThread t = (WorkerThread)threads.remove(0);
t.shutdown();
}
}
public synchronized void currentStatus() {
System.out.println("-----------------------------------------------");
System.out.println("Thread count = " + threads.size());
Iterator it = threads.iterator();
while(it.hasNext()) {
WorkerThread t = (WorkerThread)it.next();
System.out.println(t.getName() + ": " + (t.isIdle() ? "idle" : "busy"));
}
System.out.println("-----------------------------------------------");
}
}
currentStatus()方法是为了方便调试,打印出所有线程的当前状态。
分享到:
相关推荐
兼容IE的JS在线预览pdf(pdfjs和pdf.worker)
Master-Worker是一个很好用的设计模式, 它可以把一个大工作分成很多小工作去执行, 等所有小工作都回来以后, 将所有的小工作结果做一个统整, 得到最终结果, 就很像专题小组有五个人, 把系统分成四等分, 每个人负责一...
PDF.js和PDF.Worker.js是Mozilla开发的开源库,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这两个JavaScript文件是实现HTML页面加载和显示PDF的关键组件,提供了纯JavaScript解决方案来处理PDF文档。 PDF.js...
8. **代码结构与设计模式**:"elegant-laravel-worker"可能采用了设计模式如观察者模式(Observer Pattern)来实现信号监听,以及策略模式(Strategy Pattern)来处理不同类型的停止逻辑。 9. **配置与部署**:部署...
- **工作池模式(Worker Pool Pattern)**:预先创建一组线程来执行任务,从而减少线程创建和销毁的成本。 #### 应用场景 - **并发系统**:在多核处理器环境下构建高并发应用程序。 - **分布式系统**:在网络环境中...
- 在多线程编程中,Worker Pattern 是一种常见的设计模式,通常用于处理任务队列。 - 一个或多个 Worker 线程不断检查任务队列,一旦发现新任务,就立即处理。 - 这种模式常用于服务器应用程序,如网络服务,因为...
良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...
它也使用而不是url-pattern ,因为我发现它使用起来更直观。 我建议将新路由器用于新项目。服务工作者路由器 适合服务人员的优雅而快速的URL路由器(可独立使用)还有另一台路由器? :grinning_face_with_smiling_...
员工类通常包含了一些通用的方法,比如工作(work)等,而具体的员工类型(如Manager、Worker)会继承这个接口并实现其具体行为。 3. **employee.cpp**:这个源文件可能包含了员工类的具体实现,比如`Employee`的...
9. `pattern`属性:用于设置输入验证规则,如邮箱格式或电话号码格式。 在"Migration-worker-details-main"文件中,可能包含这个HTML表单的源代码,以及可能的CSS(Cascading Style Sheets)和JavaScript文件,它们...
本主题聚焦于C#中的“基于事件的异步模式”(Event-based Asynchronous Pattern, EAP),这是一种为用户界面(UI)应用程序设计的异步编程模型。下面我们将深入探讨这一模式以及与之相关的多线程、委托和源码实现。 ...
<url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> ``` 2. **配置server.xml**:在Tomcat的主配置文件`conf/server.xml`中,你需要确保`Host`元素配置了正确的目录结构,特别是`appBase`属性...
自定义Linux系统的core_pattern和coredump实用程序 在K8S集群中的workernode上应用自定义核心转储 将custom-coredump-01.tar.gz复制到K8S主节点,然后执行以下操作 #tar -zcvf custom-coredump-01.tar.gz #cd脚本#...
这个缩写可能有很多含义,但在编程上下文中,它可能指代 "Pattern"(模式)、"Programmer's Algorithm Test"(程序员算法测试)或其他某种特定的编程技术。如果 PAT 是一个特定的库或工具,那么它可能与特定的编程...
Service Worker 是一种在浏览器后台运行的脚本,它允许开发者拦截和处理网络请求,从而实现离线缓存、消息推送等功能。在 Next.js 应用程序中集成 Service Worker,可以显著提升用户体验,尤其是在网络条件不稳定...
<url-pattern>/*</url-pattern> ``` 并确保 CSRFFilter 类正确实现了过滤逻辑。 总结,通过以上步骤,我们可以成功地在 Linux 上安装并配置 Apache、Tomcat 和 mod_jk,实现负载均衡。这不仅可以提高系统的可用性...
而观察者模式(Observer Pattern)则是一种设计模式,它允许一个对象的状态变化自动通知其他依赖该对象的对象。在多线程环境下,观察者模式可以被巧妙地应用于子线程通知主线程的情况。 观察者模式的核心思想是定义...
以下是对这个"Example-TypeScript-Singleton-Pattern"项目的详细解析。 1. **TypeScript 基础知识**: TypeScript 是 JavaScript 的超集,提供了静态类型系统、接口、类、枚举等特性,增强了代码的可维护性和...
基本格式为: # pattern_namevalue avalue {sub_pattern}# sub_patternbc得出value a , value b或value c 。 有关更全面的示例,请参见terms.txt 。 随时打开PR添加更多条款! 然后运行python main.py示例输出...