tomcat说白了就是一个socket服务线程,监听8080端口,一旦有连接过来就生成一个socket来对应,然后把socket扔给后端的Executor线程池,由线程池中的一个线程负责进行后续的处理,而ServerSocket线程继续监听等待下一个连接的到来。
0.由Http11Protocol类的构造函数Http11Protocol()构造出JIoEndpoint对象
endpoint = new JIoEndpoint();
1.调用JIoEndpoint的bind()方法,创建一个ServerSocket对象
serverSocket = serverSocketFactory.createSocket(getPort(),
getBacklog());
2.调用JIoEndpoint类的startInternal()方法,startInternal()中调用父类AbstractEndpoint中的startAcceptorThreads()方法
3.startAcceptorThreads()方法中,回调JIoEndpoint类中的createAcceptor()方法,来取得一个Acceptor对象(Acceptor类实现了Runnable接口,并实现了run方法),然后创建一个线程,并启动。
Thread t = new Thread(acceptors[i], getName() + "-Acceptor-" + i);
t.start();
4.线程启动后回自动调用Acceptor中实现的run方法,run方法中调用serverSocket的accept方法,等待接入客户端发起的连接,有连接接入后,调用processSocket(socket)来处理请求。processSocket方法里面会把socket扔给Executor线程池里面的一个线程,所以processSocket(socket)会很快返回,接着进行下一次while循环,继续等待下一个连接的接入。
public void run() {
while (running) {
socket = serverSocketFactory.acceptSocket(serverSocket);
if (!processSocket(socket)) {
countDownConnection();
// Close socket right away
closeSocket(socket);
}
}
}
5.processSocket方法里面会用传入的socket创建一个SocketWrapper对象,然后再用SocketWrapper对象创建一个SocketProcessor对象,SocketProcessor类实现了Runnable接口并且实现了run方法。接着调用StandardThreadExecutor类的execute方法。
protected boolean processSocket(Socket socket) {
SocketWrapper wrapper = new SocketWrapper(socket);
getExecutor().execute(new SocketProcessor(wrapper));
return true;
}
6.StandardThreadExecutor类里面维护了一个ThreadPoolExecutor线程池,execute方法里面会把SocketProcessor线程对象传给线程池中的一个线程Thread,并启动该线程,start以后会自动回调SocketProcessor中的run方法。
7.SocketProcessor的run方法中,继续进行后续的处理。
预知后续处理如何,请见下回分解。
分享到:
相关推荐
在本章"Eclipse开发学习笔记第17章源码"中,我们将深入探讨如何使用Eclipse集成开发环境(IDE)来构建一个实际的在线购物系统。这个实例将涵盖多个关键的IT知识点,包括软件工程的设计原则、Java编程、Web应用程序...
相比之下,NIO和NIO2提供了更高效的多路复用机制,允许多个连接共享少量线程,从而提高了并发处理能力。 在描述中提到的APR(Apache Portable Runtime)库是Apache HTTP Server的一部分,它提供了一种方式让Tomcat...
7. **多线程**:Java支持多线程编程,通过Thread类和Runnable接口可以实现并发执行。学习如何同步和通信,避免线程安全问题,对于编写高并发应用至关重要。 8. **网络编程**:Java的Socket编程允许创建网络应用,如...
- 多线程:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字,wait(),notify(),notifyAll())。 - 文件和I/O流:文件读写、缓冲流、对象序列化和反序列化。 - 网络编程:Socket编程,TCP和...
### JAVA笔记要点解析 #### JAVASE概述与基础概念 - **数组与数组拷贝**: - 数组是固定大小的数据结构,用于存储同种类型的数据元素。 - `java.lang.System`类中提供了静态方法`arraycopy`用于数组拷贝。此方法...
Java内置了对多线程的支持,通过Thread类或Runnable接口实现。多线程可以提高程序的并发执行能力,提升效率。 9. **网络编程** Java提供了丰富的网络编程API,如Socket和ServerSocket,可以构建客户端和服务端...
4. **多线程**:Java提供对多线程的支持,理解线程的创建、同步和通信有助于编写高效并发代码。 5. **网络编程**:Java的Socket编程允许开发网络应用。理解TCP和UDP协议,以及如何创建客户端和服务器是必备技能。 ...
Servlet 还支持一些其他的辅助功能,例如处理多线程并发等技术细节。 下面是一个使用 Servlet 创建 web App 的步骤: 首先,创建一个 Maven 项目,使用 IDEA 创建一个 Maven 项目,选择项目要存放的目录,然后创建...
4. **多线程处理连接**:对于并发连接,服务器通常需要开启多个线程或者使用非阻塞IO(NIO)或异步IO(AIO)来处理多个客户端请求。`ExecutorService`和`Future`可以用来管理线程池,提高性能和资源利用率。 5. **...
8. **J2SE学习笔记(7)多线程.DOC**:多线程是并发编程的关键,这部分可能会讲解线程的创建、同步、生命周期管理以及死锁问题。 这些笔记为学习J2EE打下了坚实的基础。一旦掌握了J2SE,就可以进一步学习J2EE的...
6. **多线程**:线程的创建、同步机制(如synchronized关键字、wait/notify机制)和线程池的使用。 7. **反射机制**:在运行时动态地获取类的信息并操作对象的能力。 8. **网络编程**:Socket通信,客户端和服务器...
2. **类库和API**:Java的标准类库提供了大量的预定义类和接口,如集合框架(ArrayList、LinkedList、HashMap等)、IO流、网络编程的Socket类、多线程的Thread和Runnable等。熟悉这些API能够极大地提高开发效率。 3...
7. 面向对象-多线程 - 线程概念:学习多线程编程的基础,包括线程的创建和运行。 - 线程同步:掌握synchronized关键字和wait/notify机制来控制线程的同步。 8. 面向对象-String、StringBuffer、基本数据类型包装...
【Servlet笔记】主要涵盖的是JavaWeb开发中的核心技术——Servlet的学习,它是Java EE(现在被称为Jakarta EE)体系中的一部分,用于构建服务器端的Web应用程序。Servlet是Java为处理HTTP请求而设计的一种API,它...
- **核心技术**:包括但不限于网络编程、多线程处理等。 #### 2. C/S和B/S架构 - **C/S架构**:即客户端/服务器(Client/Server)架构。客户端软件负责用户界面显示,服务器端负责数据处理和存储。 - **特点**:安全...
Java的核心特性包括跨平台性、垃圾回收机制、异常处理、多线程以及丰富的类库。 在JavaSE的学习中,首先需要掌握的是基础语法,包括变量、数据类型(如基本类型和引用类型)、运算符、流程控制(如if语句、switch...
- **多线程**:Java以其强大的并发处理能力著称,线程池、守护线程、同步机制(synchronized、Lock接口)等都是后端开发中的核心概念。 - **网络编程**:Socket编程是Java实现网络通信的基础,包括TCP/IP协议栈的...
[目录]Jbuilder及Swing,多线程问题讨论 7. [目录]快乐Java大家谈 1. [目录]活动简介 2. [目录]庆祝专区 3. [目录]dW站点简介 4. [目录]待审稿件 5. [目录]已审稿件 6. [目录]...
9. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口创建线程。线程同步机制包括synchronized关键字、wait/notify、Lock和Condition等。 10. **网络编程**:Java提供了Socket和ServerSocket类...
6. **多线程**:为了保证聊天的实时性,应用可能采用多线程,使得服务器能够并发处理多个用户的聊天请求。 【压缩包子文件的文件名称列表】"chatroom"可能是整个项目的根目录,包含所有源代码、配置文件、数据库...