java BIO的工作机制

在谈BIO之前先说明几个词语的语义,比如同步和异步,阻塞和非阻塞,那么这几个词什么意思呢?

同步:同步就是按事情的既定顺序做事,有次序的工作。

异步:异步就是做事没有顺序,只要完成就好。

举个例子,比如你要吃饭然后去教室读书,同步就是你必须先吃饭,然后再去读书,异步就是你看到很多人在排队吃饭,你先去读书,排队人少了再过来吃饭,或者是一边读书,一边排队吃饭。

那么什么是阻塞和非阻塞呢?

再举个例子,比如你和朋友在微信聊天,你发了消息,朋友没有回复你,你没有做任何事,一直在等待回复,这就是阻塞,如果朋友没有回复你,你就先学习了,并没有只是空闲的等待,这就是非阻塞。

说完了同步和异步,阻塞和非阻塞,再来说说BIO吧。

BIO:即blocking I/O,翻译过来就是同步阻塞的I/O,即每个线程做任务时只能做自己的任务,并且对方没有回复时,一直等待。从定义来看就知道效率太低了,如果是这样的程序员估计早被公司开除了。

那么工作机制是怎么样的呢?

那么就看看数据是如何传输的吧,当服务端与客户端建立通信链路都是通过Socket来完成的,如果服务端和客户端已经建立连接,那么都会有一个Socket实例,每个Socket实例都有一个inputStream和outputStream,并且当创建Socket对象的时候,操作系统会给inputStream和outputStream分配一个缓存区,服务端和客户端就是通过缓存区来进行信息传递。


写入端将数据写入到outputStream的SendQ队列中,当SendQ存满后,数据就转移到另一端的inputStream的RecvQ中,如果这是inputStream中的RecvQ中已经满了,那么outputStream中的write方法就会阻塞,等到RecvQ中有足够的的空间时,才可以继续接受传过来的数据,因此这个缓存空间的大小非常的重要,缓存空间大小以及写入和读取的速度都会影响这个通信链路的效率,并且如果两端同时传递数据那么就可能产生死锁。

同步阻塞就是客户端过来一个请求,服务端开启一个线程处理,这个线程只能处理完毕这个请求才能处理其它的请求,为了同时处理多个请求,只能开启多个线程,每个请求处理一个任务,一一对应,处理完成的线程在进行线程销毁。但是启动线程和销毁线程的开销较大,因此可以通过创建线程池的办法来减少线程创建和回收的成本。

如图所示,使用线程池解决BIO存在的一些问题,但是在某些场景下BIO还是存在着问题,NIO的出现解决了BIO带来的很多问题,不过NIO的工作方式要等下次再发文了,喜欢的朋友们点个赞呀。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值