每日一学之socket编程(二)

图片来自与百度图片

为什么要引入线程

在实际的开发中,一个ServerSocket服务端最小都有几十上百个客户端进行访问。当数据处理不及时,就会造成连接阻塞。

不知道大家是否还记的昨天的最简单的服务端编码每日一学之socket编程(一),大家可以使用将此服务端运行起来,用多个客户端进行访问,

使用上述代码打印出访问的客户端的IP和端口。你就会发现,如果上一个客户端一直不关闭,后面的客户端就会一直阻塞在那里。这样的软件是相当不友好的。因此我们需要引入多线程的机制来解决这个问题。

产生阻塞的位置

通过下面两段代码,帮助大家认识多连接socket会发生阻塞的位置。

代码一

运行结果

代码二

运行结果

因此,阻塞后续socket进行连接的罪魁祸首是对输入输出流的处理。

解决方式

多线程解决多连接

是不是so easy,不过在这里一定要注意:ServerSocket永远只有一个哦,他就一个端口,一个端口只能够被绑定一次。

不知道大家有没有发现上面程序的缺点,那就是会无限的创建线程,这样服务器也压力山大啊,因此,此种方法是不可取的。不过没关系,办法总比困难多,暂不还有好朋友线程池(ThreadPool)嘛,让他来帮我们把线程管理起来。

线程池解决多连接

在Java中利用Executors来获取线程池,Executors提供了四种线程池供大家在不同场景下进行选择,这里以newCachedThreadPool为例,为大家讲述怎么利用线程池来解决实际情况下的多连接问题。

newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

运行结果

从结果可以看出,第三次连接使用了第二次创建的线程。

下期提要

下期将接触到Java中的NIO中非常重要的一部分知识Buffer!敬请期待!

源码下载地址:https://pan.baidu.com/s/1bMRFkU

本文来自企鹅号 - 人人会编程媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

SAP CRM和Cloud for Customer中的Event handler(事件处理器)

这些事件处理器实际上就是UI控制器(Controller)上具有特定接口类型的方法。

841
来自专栏架构师之旅

关于Socket高并发的原理介绍及使用Apache Mina带来线上的问题分析

上周在线上出现了一个很低级的问题,但是正是这个低级的问题引起了我的兴趣,其实所谓的低级是因为配置文件配置错了,原本线上是为每个客户端设置了一个席位,就说是客户端...

1163
来自专栏云计算

使用 Spring Boot 2.0,Eureka 和 Spring Cloud 的微服务快速指南

原文地址:https://dzone.com/articles/quick-guide-to-microservices-with-spring-boot-20...

1.4K1
来自专栏用户2442861的专栏

ubuntu14.04 安装Lua

http://blog.csdn.net/qq_30004245/article/details/52869291

442
来自专栏Android干货

Retrofit2.0 设置 连接超时

有一个接口,返回的数据量因为业务的原因 会返回很大的数据量,此时网络不大好的情况下,会出现请求失败的情况

512
来自专栏散尽浮华

如何查询一个进程下面的线程数(进程和线程区别)

在平时工作中,经常会听到应用程序的进程和线程的概念,那么它们两个之间究竟有什么关系或不同呢? 一、对比进程和线程 1)两者概念 . 进程是具有一定独立功能的程序...

2389
来自专栏iOS 开发杂谈

iOS多线程之一:基本概念

进程:就是一个正在执行的程序。 线程:是执行程序最基本的单元,它有自己栈和寄存器。

551
来自专栏逆向与安全

GDB多线程调试分析

多线程调试的主要任务是准确及时地捕捉被调试程序线程状态的变化的事件,并且GDB针对根据捕捉到的事件做出相应的操作,其实最终的结果就是维护一根叫thread li...

790
来自专栏IT技术精选文摘

解Bug之路-记一次JVM堆外内存泄露Bug的查找

1123
来自专栏Python中文社区

Phantomjs的正确打开方式

專 欄 ❈ 作者:nmask 博客地址: https://thief.one/ ❈ 前段时间分析了Selenium+Phantomjs的使用方法以及性能优化问...

27010

扫码关注云+社区