阻塞IO和非阻塞IO

一、阻塞IO

因为阻塞IO的存在,导致只能使用一个线程进行等待,等待的线程也会引起额外的资源消耗,引起CPU调度问题。如果数量达到百万级,需要发送的数量非常多,此时,大量的时间被用在了线程切换上,我们需要做的是尽量减少CPU处理线程消耗的时间,用来处理真正需要处理的数据。

当有客户端到达的时候,服务器会进行接收后的处理流程。accept会由阻塞状态变为非阻塞执行状态,会开启两个线程处理获取到的socket的inputstream和outputstream。如果不是即时写数据的话,只是需要开一个线程读取数据。输出可以通过线程池处理。所以,如果有1000个客户端连接,至少需要1000+个线程。如果读、写均开线程,那么需要2000+个线程,线程大部分在read()或write()处处于阻塞状态,此时线程没有处理任何内容,只是等待CPU的调度,此时需要消耗CPU线程切换时间。当线程读取到信息或者需要写入信息时,线程从阻塞状态切换到运行状态,CPU需要从用户状态切换到内核状态,此时需要消耗大量的时间。在1.4之前,一个线程大概占用1M的内存,虽然java8或java9一个线程的消耗只有几百K,但是当达到上万级别的时候,也是比较大的内存消耗。

 

二、非阻塞IO线程的优势

当客户端进行连接后,先注册连接,然后回调相应的方法。

此时,线程只有一个,只有主线程,此时主线程实际上是串行的处理模式,串行地进行客户端的连接监听、串行地进行数据的读取、输出事件。此时,一个线程处理所有客户端的所有事件,该线程一直处于繁忙状态,利用率比较高,此时可以说线程的性能比较高(不是指传输速度)。但不是充分利用了整个服务器的性能,服务器肯定不止一个cpu,一个线程肯定是弱化了它的能力。

如果对这些事件进行分组,通过线程池进行处理,从而满足计算机性能的调度。

 

三、NIO

NIO全称:Non-blocking I/O

JDK 1.4引入全新的输入输出标准库NIO,也叫New I/O

在标准的Java代码中提供了高速的、可伸缩的、面向块的、非阻塞IO操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值