作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
阻塞I/O+线程池
网络模型是阻塞I/O+多线程
网络模型的改进版,人们意识到每次有新连接创建和销毁线程的代价太大,就用线程池来解决这个问题:每次接收到新连接后从池中取一个空闲线程进行处理,处理完成后再放回池中,重用线程避免了频率地创建和销毁线程带来的开销。
和”阻塞I/O+多线程”相比,在大量短连接的场景中性能会有提升,因为不用每次都创建和销毁线程,而是重用连接池中的线程。但在大量长连接的场景中,因为线程被连接长期占用,不需要频繁地创建和销毁线程,因而没有什么优势。
代码示例
ThreadPoolEchoServer源代码
|
|
Worker源代码
|
|
验证
1、启动服务。
执行上面的命令,启动服务,输出信息:
2013-10-24 21:06:43 cn.aofeng.demo.io.ThreadPoolEchoServer main
信息: 线程池网络echo服务启动完毕,监听端口:9090
2、打开三个终端窗口,执行命令:
服务输出如下信息:
2013-10-24 21:11:05 cn.aofeng.demo.io.ThreadPoolEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:1167
2013-10-24 21:11:10 cn.aofeng.demo.io.ThreadPoolEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:1170
2013-10-24 21:11:15 cn.aofeng.demo.io.ThreadPoolEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:1171
注:服务所在机器的IP地址是192.168.56.102。
3、连接一段时间后,从终端输入exit或quit指令,服务端关闭连接,对应的线程也随之销毁,如下图所示:
可以看到连接池创建了三个线程(pool-1-thread,pool-2-thread,pool-3-thread),当连接关闭后,线程并没有销毁,只是从运行状态变成空闲状态。