非阻塞IO

Java阻塞IO与非阻塞IO

别等时光非礼了梦想. 提交于 2021-01-06 05:22:09
IO: IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 阻塞与非阻塞: 一辆从 A 开往 B 的公共汽车上,路上有很多点可能会有人下车。司机不知道哪些点会有哪些人会下车,对于需要下车的人,如何处理更好? 司机过程中定时询问每个乘客是否到达目的地,若有人说到了,那么司机停车,乘客下车。 ( 类似阻塞式 ) 每个人告诉售票员自己的目的地,然后睡觉,司机只和售票员交互,到了某个点由售票员通知乘客下车。 ( 类似非阻塞 ) 很显然,每个人要到达某个目的地可以认为是一个线程,司机可以认为是 CPU 。在阻塞式里面,每个线程需要不断的轮询,上下文切换,以达到找到目的地的结果。而在非阻塞方式里,每个乘客 ( 线程 ) 都在睡觉 ( 休眠 ) ,只在真正外部环境准备好了才唤醒,这样的唤醒肯定不会阻塞。 阻塞式I/O:(传统的IO) 以网络应用为例,在传统IO方式(阻塞IO)中需要监听一个ServerSocket,接受请求的连接为其提供服务(服务通常包括了处理请求并发送响应)下图是服务器的生命周期图,其中标有粗黑线条的部分表明会发生I/O阻塞。 此方式在遇到多请求时,只能等待前面的请求完成后才能处理新的请求,所以通常在Java中处理阻塞I/O要用到线程(大量的线程)。代码如下 public class