首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java 中的伪异步 IO

Java 中的伪异步 IO

作者头像
LieBrother
发布2019-04-02 11:00:16
发布2019-04-02 11:00:16
1.4K0
举报
文章被收录于专栏:LieBrotherLieBrother

本文简单介绍 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() 方法也是阻塞的。

做个有梦想的程序猿

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LieBrother 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档