tomcat开启socket的accept线程后,其实要做的主要工作是交给worker线程去完成的,这其中使用了线程池的技术。
如:
-
try
{
-
SocketWrapper<Socket> wrapper = new
SocketWrapper<Socket>(socket);
-
wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());
-
getExecutor().execute(new
SocketProcessor(wrapper));
-
}
try {
SocketWrapper<Socket> wrapper = new SocketWrapper<Socket>(socket);
wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());
getExecutor().execute(new SocketProcessor(wrapper));
}
事实上tomcat对ThreadPoolExecutor做了一点小小的封装。
先来看一个简单的java api——ThreadPoolExecutor的使用
-
package
com.test.threadpool;
-
import
java.util.concurrent.*;
-
public
class
ThreadpoolTest {
-
-
-
-
-
public
static
void
main(String[] args) {
-
-
int
minSpareThreads =
10
;
-
int
maxThreads =
200
;
-
LinkedBlockingQueue<Runnable> workQueue = new
LinkedBlockingQueue<Runnable>();
-
ThreadPoolExecutor executor = new
ThreadPoolExecutor(minSpareThreads, maxThreads,
60
, TimeUnit.SECONDS,workQueue);
-
for
(
int
i =
0
; i <=
5
; i++) {
-
executor.execute(createTask(i));
-
}
-
-
executor.shutdown();
-
}
-
-
private
static
Runnable createTask(
final
int
taskID) {
-
return
new
Runnable() {
-
public
void
run() {
-
System.out.println("Task"
+ taskID +
"开始"
);
-
System.out.println("Hello world"
);
-
System.out.println("Task"
+ taskID +
"结束"
);
-
}
-
};
-
}
-
-
}
package com.test.threadpool;
import java.util.concurrent.*;
public class ThreadpoolTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int minSpareThreads = 10;
int maxThreads = 200;
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(minSpareThreads, maxThreads, 60, TimeUnit.SECONDS,workQueue);
for (int i = 0; i <=5 ; i++) { //创建6个任务
executor.execute(createTask(i));
}
executor.shutdown();
}
private static Runnable createTask(final int taskID) {
return new Runnable() {
public void run() {
System.out.println("Task" + taskID + "开始");
System.out.println("Hello world");
System.out.println("Task" + taskID + "结束");
}
};
}
}
所要执行的任务,只要是Runnable,然后交给executor执行,显得很简单。
tomcat对其封装在package org.apache.tomcat.util.threads中,可以看看
分享到:
相关推荐
Apache Tomcat源码分析 Apache Tomcat是一款广泛应用的开源Java Servlet容器,它是Java EE Web应用程序的标准实现。Tomcat源码的深入理解对于Java Web开发者来说是至关重要的,它可以帮助我们了解HTTP服务器的工作...
Tomcat使用了线程池来处理请求,通过`Executor`接口和实现类,如`ThreadPoolExecutor`,可以调整线程池参数以优化性能。 5. **安全性**: Tomcat的安全特性包括SSL/TLS支持,角色和权限管理,以及基于JAAS(Java ...
ArchKnowledgeTree ... 源码分析之Java线程池ThreadPoolExecutor 常见工具 [源码分析之Guava RateLimiter源码分析](source_code/源码分析之Guava RateLimiter源码分析.md) 源码分析之netty线程模型 Mes
通过分析Tomcat 6.0的源码,开发者不仅可以学习到Servlet和JSP的运行机制,还可以了解到Web服务器的设计模式、性能优化以及安全性控制等方面的知识。这对于提升Java Web开发技能和理解服务器底层运作至关重要。
- 使用ExecutorService和ThreadPoolExecutor可以更有效地管理线程池,提高服务器性能。 5. **文件I/O操作**: - 当Web服务器需要返回静态资源(如HTML、CSS、JavaScript文件)时,它需要进行文件I/O操作。 - ...
【Tomcat源码分析】 Tomcat是Java应用服务器,其源码剖析有助于理解类加载器的工作原理以及如何处理HTTP请求。了解Tomcat的内部机制对于优化Web应用性能和排查问题非常有帮助。 【NIO与Netty】 非阻塞I/O (NIO) ...
在IT领域,多线程是程序设计中的一个重要概念,它允许程序同时执行多个任务,从而提高了计算机系统的资源利用率和程序的执行...无论是源码分析还是工具使用,都需要开发者不断实践和探索,才能在实际项目中游刃有余。
Java平台提供了丰富的并发工具,如线程池(java.util.concurrent.ThreadPoolExecutor)、Future和Callable接口,以及并发集合(ConcurrentHashMap、ConcurrentLinkedQueue等),这些工具使得开发者能够在多线程环境...