前面谈了多线程应用程序能极大地改善用户相应。例如对于一个Web应用程序,每当一个用户请求服务器连接时,服务器就可以启动一个新线程为用户服务。
然而,创建和销毁线程本身就有一定的开销,如果频繁创建和销毁线程,CPU和内存开销就不可忽略,垃圾收集器还必须负担更多的工作。因此,线程池就是为了避免频繁创建和销毁线程。
每当服务器接受了一个新的请求后,服务器就从线程池中挑选一个等待的线程并执行请求处理。处理完毕后,线程并不结束,而是转为阻塞状态再次被放入线程池中。这样就避免了频繁创建和销毁线程。
Worker Pattern实现了类似线程池的功能。首先定义Task接口:
package com.crackj2ee.thread;
public interface Task {
void execute();
}
线程将负责执行execute()方法。注意到任务是由子类通过实现execute()方法实现的,线程本身并不知道自己执行的任务。它只负责运行一个耗时的execute()方法。
具体任务由子类实现,我们定义了一个CalculateTask和一个TimerTask:
// CalculateTask.java
package com.crackj2ee.thread;
public class CalculateTask implements Task {
private static int count = 0;
private int num = count;
public CalculateTask() {
count++;
}
public void execute() {
System.out.println("[CalculateTask " + num + "] start...");
try {
Thread.sleep(3000);
}
catch(InterruptedException ie) {}
System.out.println("[CalculateTask " + num + "] done.");
}
}
// TimerTask.java
package com.crackj2ee.thread;
public class TimerTask implements Task {
private static int count = 0;
private int num = count;
public TimerTask() {
count++;
}
public void execute() {
System.out.println("[TimerTask " + num + "] start...");
try {
Thread.sleep(2000);
}
catch(InterruptedException ie) {}
System.out.println("[TimerTask " + num + "] done.");
}
}
以上任务均简单的sleep若干秒。
TaskQueue实现了一个队列,客户端可以将请求放入队列,服务器线程可以从队列中取出任务:
package com.crackj2ee.thread;
import java.util.*;
public class TaskQueue {
private List queue = new LinkedList();
public synchronized Task getTask() {
while(queue.size()==0) {
try {
this.wait();
}
catch(InterruptedException ie) {
return null;
}
}
return (Task)queue.remove(0);
}
public synchronized void putTask(Task task) {
queue.add(task);
this.notifyAll();
}
}
分享到:
相关推荐
兼容IE的JS在线预览pdf(pdfjs和pdf.worker)
Master-Worker是一个很好用的设计模式, 它可以把一个大工作分成很多小工作去执行, 等所有小工作都回来以后, 将所有的小工作结果做一个统整, 得到最终结果, 就很像专题小组有五个人, 把系统分成四等分, 每个人负责一...
PDF.Worker.js则是PDF.js的一个辅助模块,它利用Web Worker技术在后台线程中执行PDF文档的解码和渲染过程,以避免阻塞主线程,提升用户体验。Web Worker允许在浏览器后台运行脚本,处理大量计算任务,而不会影响用户...
8. **代码结构与设计模式**:"elegant-laravel-worker"可能采用了设计模式如观察者模式(Observer Pattern)来实现信号监听,以及策略模式(Strategy Pattern)来处理不同类型的停止逻辑。 9. **配置与部署**:部署...
- **工作池模式(Worker Pool Pattern)**:预先创建一组线程来执行任务,从而减少线程创建和销毁的成本。 #### 应用场景 - **并发系统**:在多核处理器环境下构建高并发应用程序。 - **分布式系统**:在网络环境中...
良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...
- 在多线程编程中,Worker Pattern 是一种常见的设计模式,通常用于处理任务队列。 - 一个或多个 Worker 线程不断检查任务队列,一旦发现新任务,就立即处理。 - 这种模式常用于服务器应用程序,如网络服务,因为...
C++工厂模式是一种设计模式,属于创建型模式,它提供了一种封装对象创建的方式,使得客户端无需知道具体的创建逻辑,而是通过一个公共的接口来获取所需的对象。在给定的例子中,我们可以通过以下文件了解其具体实现...
本主题聚焦于C#中的“基于事件的异步模式”(Event-based Asynchronous Pattern, EAP),这是一种为用户界面(UI)应用程序设计的异步编程模型。下面我们将深入探讨这一模式以及与之相关的多线程、委托和源码实现。 ...
`workers.properties`文件定义了这些连接器,即"workers",每个worker代表一个Tomcat实例。例如: ```properties worker.list=worker1 worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1....
"Migration-worker-details"项目可能是一个旨在帮助管理和记录移民工人详细信息的系统,通过HTML来实现用户界面。这样的系统可能对人力资源管理、社会保障、劳动权益保护等领域具有重要意义。 HTML是一种标记语言,...
Service Worker 是一种在浏览器后台运行的脚本,它允许开发者拦截和处理网络请求,从而实现离线缓存、消息推送等功能。在 Next.js 应用程序中集成 Service Worker,可以显著提升用户体验,尤其是在网络条件不稳定...
它也使用而不是url-pattern ,因为我发现它使用起来更直观。 我建议将新路由器用于新项目。服务工作者路由器 适合服务人员的优雅而快速的URL路由器(可独立使用)还有另一台路由器? :grinning_face_with_smiling_...
而观察者模式(Observer Pattern)则是一种设计模式,它允许一个对象的状态变化自动通知其他依赖该对象的对象。在多线程环境下,观察者模式可以被巧妙地应用于子线程通知主线程的情况。 观察者模式的核心思想是定义...
"test" 通常代表这是一个测试用例或者测试代码,"pat" 可能是指某种模式或算法的缩写,而 "sync_worker" 很可能是关于同步工作线程或者进程的。在IT行业中,同步工作通常涉及到多线程编程和并发控制。 1. **测试...
自定义Linux系统的core_pattern和coredump实用程序 在K8S集群中的workernode上应用自定义核心转储 将custom-coredump-01.tar.gz复制到K8S主节点,然后执行以下操作 #tar -zcvf custom-coredump-01.tar.gz #cd脚本#...
<url-pattern>/*</url-pattern> ``` 并确保 CSRFFilter 类正确实现了过滤逻辑。 总结,通过以上步骤,我们可以成功地在 Linux 上安装并配置 Apache、Tomcat 和 mod_jk,实现负载均衡。这不仅可以提高系统的可用性...
4. **离线存储**:HTML5的`Application Cache`(AppCache)或Service Worker允许开发者创建离线应用,这意味着即使在网络不稳定或者断开的情况下,表单仍能正常显示和提交。 5. **表单API**:HTML5的`FormData`对象...
观察者模式(Observer Pattern)是一种设计模式,用于在对象之间建立一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,`java.util.Observable`和`java....