Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要讲的是如何使用NIO的网络新特性,来构建高性能非阻塞并发服务器.
文章基于个人理解,我也来搞搞NIO.,求指正.
在NIO之前
服务器还是在使用阻塞式的java socket. 以Tomcat最新版本没有开启NIO模式的源码为例, tomcat会accept出来一个socket连接,然后调用processSocket方法来处理socket.
01 | while ( true ) { |
02 | .... |
03 | Socket socket = null ; |
04 | try { |
05 | // Accept the next incoming connection from the server |
06 | // socket |
07 | socket = serverSocketFactory.acceptSocket(serverSocket); |
08 | } |
09 | ... |
10 | ... |
11 | // Configure the socket |
12 | if (running && !paused && setSocketOptions(socket)) { |
13 | // Hand this socket off to an appropriate processor |
14 | if (!processSocket(socket)) { |
15 | countDownConnection(); |
16 | // Close socket right away(socket); |
17 | closeSocket(socket); |
18 | } |
19 | } |
20 | .... |
21 | } |
使用ServerSocket.accept()方法来创建一个连接. accept方法是阻塞方法,在下一个connection进来之前,accept会阻塞.
在一个socket进来之后,Tomcat会在thread pool里面拿出一个thread来处理连接的socket. 然后自己快速的脱身去接受下一个socket连接. 代码如下:
01 | protected boolean processSocket(Socket socket) { |
02 | // Process the request from this socket |
03 | try { |
04 | SocketWrapper<Socket> wrapper = new SocketWrapper<Socket>(socket); |
05 | wrapper.setKeepAliveLeft(getMaxKeepAliveRequests()); |
06 | // During shutdown, executor may be null - avoid NPE |