专栏首页LieBrotherJava 中的伪异步 IO

Java 中的伪异步 IO

本文简单介绍 Java 中的 伪异步 IO 知识。

1

伪异步 IO 通信模型

伪异步 IO 通信模型如下图所示:

上篇文章中 Java BIO 认识 介绍了 BIO 的弊端,就是服务端会对每个客户端的请求单独创建一个线程来处理,这样子很浪费资源,特别是高并发的时候,资源容易被耗尽导致宕机。

伪异步 IO 通过使用线程池来优化 BIO,只是解决线程不过多的创建这个问题,没有解决阻塞 IO,所以被称为伪异步 IO。

伪异步 IO 大概的流程是:在服务端接收到新的客户端请求的时候,不是创建一个新的线程来处理,而是把客户端的 Socket 封装成一个 Task,放到线程池里面,由线程池处理这个任务,线程池的线程大小等可以设置,资源的占用是可以控制的,所以解决了 BIO 的资源浪费问题。

2

伪异步 IO 的一个简单例子

  • BioServer 作为服务端。创建一个 ServerSocket 绑定 IP,调用 accept() 来接收客户端的请求,每接收到一个客户端的请求,就把 Socket 封装成一个任务,传给线程池执行。
  • BioHandler 用来处理客户端的请求。通过 BufferedReader 接收客户端请求的输入内容,用 PrintWriter 返回输出内容到客户端。下面代码实现如果客户端发送的内容是 current time,则返回当前的时间。
  • BioServerHandlerExecutePool 为执行任务的线程池。任务通过线程池来执行。
  • BioClient 作为客户端,连接服务端,然后通过 PrintWriter 向服务端发送数据,使用 BufferedReader 接收服务端返回的数据。

3

伪异步 IO 弊端

伪异步解决了 BIO 的资源占用问题,但是依旧没有解决 IO 阻塞问题,因为 InputStream 中的 read() 方法读取数据时,它是一直阻塞的,直到发生有数据可读、可用数据已经读取完毕、发送空指针或者 IO 异常,才不阻塞,即是发送请求或者应答消息比较慢,读取数据需要 20s,则对方也需要阻塞 20s。OutputStream 中的 write() 方法也是阻塞的。

做个有梦想的程序猿

本文分享自微信公众号 - LieBrother(gh_b6002a4cbc1f),作者:JamesCSH

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java BIO 认识

    服务端由一个独立的 Acceptor 线程负责监听所有客户端的连接,接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完成之后,通过输出流返回应...

    LieBrother
  • 结构型模式:享元模式

    我们就拿这幅画来说,里面画了草、树、路、山、天空等等。如果没有用享元模式,我们可能这样子实现。

    LieBrother
  • 成熟的 Git 分支模型

    在学校不管是自己写课程设计还是给老师做项目,有 2 到 3 个人一起协作开发时就会使用 Git ,但是只是简单用了它所提供的代码协作功能,在学校的项目,比如课程...

    LieBrother
  • 卧槽!牛皮了,头一次见有大佬把TCP三次握手四次挥手解释的这么明白

    在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。

    杰哥的IT之旅
  • Https全揭秘系列-实践与分析

    Https全揭秘系列 - 实践与分析 通过前面两篇文章,我们对于Https协议和TLS握手协议有了一定的理解,但是我认为不经过真正实践的话根本无法掌握这个协议,...

    企鹅号小编
  • 《大胖 • 小课》- 玩玩多文件配多进度上传

    这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第4节-《玩玩多文件配多进度上传》

    zz_jesse
  • TCP 三次握手与四次挥手 看了你必懂

    最近在思考一个问题,当我们在浏览器中输入URL按下回车键后,他的详细流程是怎样的;以前刚用springMVC的时候弄懂了一个请求的流程,好几个月以为那就是我想要...

    用户2141593
  • TCP 三次握手与四次挥手 看了你必懂

    最近在思考一个问题,当我们在浏览器中输入URL按下回车键后,他的详细流程是怎样的;以前刚用springMVC的时候弄懂了一个请求的流程,好几个月以为那就是我想要...

    矿泉水
  • 管理问题背后往往是技术问题

    之前发了一篇关于智慧城市的文章”谈谈智慧城市泡沫”,引发了朋友圈几个人的讨论,其中讨论到了市政项目当中遇到的管理难题,下面是截图对话。

    用户5829239
  • 【每天一道编程系列-2018.1.30】(Ans)

    Enter a line of characters. Please count the numbers of letters, spaces, number...

    yesr

扫码关注云+社区

领取腾讯云代金券