请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

3回答

Qiujuer 2019-06-19 19:07:21

关于为什么回答问题不及时的原因:http://www.imooc.com/article/288131

我来说一下吧:

  1. IO:普通的流操作,该操作最大的弊端是发送或接收数据需要持续等待,如果网络通道未就绪比如没有数据到达时会持续阻塞到数据到达,从而浪费大量CPU资源。

  2. NIO:说的没错可以理解为同步非阻塞,这里分2部来说:非阻塞是指我们要发送或接收数据时可以在通道上注册事件,当通道就绪,比如有真正的数据到达时我们遍历到了才进行处理,而在没有达到的这个时期可以做其他的事情。但是同步如何理解呢,同步是说虽然我们的注册到发送或者接收这个时机是异步的,但是到真正的通道就绪后我们肯定是需要进行数据的发送或者接收的,此时的发送接收其实是同步操作,如果此时我们要接收数据到文件,那么我们需要读取数据并存储到文件,这个过程同时受限于网络和磁盘速度;所以往往在NIO调度中会有一层IoArgs层用来做缓冲,减少磁盘的速度影响,但是从网络数据和IoArgs之间的交互却依然是同步的。

  3. AIO:可以理解为在NIO的基础上把数据的发送接收也进行了异步操作。在NIO中我们发送数据是把数据填充到IoArgs中,随后等到就绪时进行发送,而发送操作是由我们的线程也就是当前用户态来完成的。而在AIO中是把数据交给系统了,让系统底层在合适的机会上自己发送数据,或者接收数据,然后再通知到业务层。所以他的数据发送接收是在系统内核态完成的,对于上层业务层来说就是完全异步的。我只需要把数据打包好,丢给系统,系统发送后给我一个回调就好了。当然并不是说这样就是绝对的最优解,实际使用AIO中会有较多的内存控制问题;这些也是需要进行处理的。


2 回复 有任何疑惑可以回复我~
  • 提问者 95287 #1
    谢谢老师!!!彻底懂了!!!
    回复 有任何疑惑可以回复我~ 2019-06-19 19:20:26
  • Qiujuer 回复 提问者 95287 #2
    不客气哈,麻烦设置一下采纳问题哈;不然会持续提醒到我这边。
    回复 有任何疑惑可以回复我~ 2019-06-19 20:42:46
等待灬 2019-06-03 21:30:33

连接和消息的处理是异步的

0 回复 有任何疑惑可以回复我~
  • 提问者 95287 #1
    你说的我都知道,我还是觉得没有解答我的疑惑。NIO是将感兴趣的时间注册到通道上,通过轮询的机制遍历得到可读或可写的操作。然后进行读写操作,所以老师代码中的意思,发送和接收只需要通过读写线程池发送一个携带着ioargs的send或recv信号,然后对应的客户端就可以干自己事情了,对channel的读写操作是由ioargs完成,信号负责注册,轮询到可读可写的时候,ioargs就开始操作channel.你觉得我这样理解对吗
    回复 有任何疑惑可以回复我~ 2019-06-04 14:55:13
等待灬 2019-06-03 21:28:43

老师住院做手术去了,不能回答问题,另外NIO是异步的,连接时注册读写的事件,也就是说客户端连接上了服务端,但是只要不发送消息,就不会有线程去处理,不会占用线程

0 回复 有任何疑惑可以回复我~
  • 提问者 95287 #1
    我知道老师身体抱恙,所以不急收到解答。另外NIO的确是同步非阻塞,而IO的是同步阻塞,AIO是异步。Java里有专门的AIO类
    回复 有任何疑惑可以回复我~ 2019-06-04 14:57:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信