前言
上一种方法是采用最简单的线程的方式,当客户端发起一个请求的时候,服务端就要相应的生成一个线程来处理这个请求,并且在处理一个请求的时候,其他请求都会被阻塞。试想一下,当在同一时间有大量的请求访问服务端时,服务端能够创建的线程数量是有一定的限制的,并不能无限地创建,这样一来就会产生服务端内存溢出或者线程不够用的错误,在该版本中我引入了线程池来管理客户端发送过来的请求,这样就不会产生这类问题。
由于只要在服务端修改即可,所以客户端的代码和上个版本一致,下面直接来看服务端的代码。
1 | public static void exportHelloService_v2(final Object service, int port) throws IOException { |
这段是暴露服务端的主要函数实现,其中引入了线程池的概念,将监听到的每个请求都放入线程池中进行管理。每个线程池中的线程是这样定义的,其实和上个版本的基本一致,在这里我只是对其进行了一个封装。
1 | public class SocketThread implements Runnable { |
总结一下:这种伪异步的方式虽然解决了线程上的管理,但是仍然是一种阻塞的方法,在效率上可能并不能提高。后面的优化考虑到用NIO的方式。