图片来自与百度图片
为什么要引入线程
在实际的开发中,一个ServerSocket服务端最小都有几十上百个客户端进行访问。当数据处理不及时,就会造成连接阻塞。
不知道大家是否还记的昨天的最简单的服务端编码每日一学之socket编程(一),大家可以使用将此服务端运行起来,用多个客户端进行访问,
使用上述代码打印出访问的客户端的IP和端口。你就会发现,如果上一个客户端一直不关闭,后面的客户端就会一直阻塞在那里。这样的软件是相当不友好的。因此我们需要引入多线程的机制来解决这个问题。
产生阻塞的位置
通过下面两段代码,帮助大家认识多连接socket会发生阻塞的位置。
代码一:
运行结果:
代码二:
运行结果:
因此,阻塞后续socket进行连接的罪魁祸首是对输入输出流的处理。
解决方式
多线程解决多连接
是不是so easy,不过在这里一定要注意:ServerSocket永远只有一个哦,他就一个端口,一个端口只能够被绑定一次。
不知道大家有没有发现上面程序的缺点,那就是会无限的创建线程,这样服务器也压力山大啊,因此,此种方法是不可取的。不过没关系,办法总比困难多,暂不还有好朋友线程池(ThreadPool)嘛,让他来帮我们把线程管理起来。
线程池解决多连接
在Java中利用Executors来获取线程池,Executors提供了四种线程池供大家在不同场景下进行选择,这里以newCachedThreadPool为例,为大家讲述怎么利用线程池来解决实际情况下的多连接问题。
newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
运行结果:
从结果可以看出,第三次连接使用了第二次创建的线程。
下期提要
下期将接触到Java中的NIO中非常重要的一部分知识Buffer!敬请期待!
源码下载地址:https://pan.baidu.com/s/1bMRFkU
领取专属 10元无门槛券
私享最新 技术干货