java中的BIO、NIO、AIO

问:java 中的BIO NIO AIO 是什么?
答: BIO NIO 和AIO 都是java中的IO 模型

BIO

BIO(Blocking IO) 也叫同步阻塞I/O 是传统的IO模型,它在读写数据时会阻塞线程,即当应用程序调用I/O操作时,该操作一直阻塞线程直到操作完成 ,直到数据读写完成,适用于并发不高,连接数较小的场景,如单线程的服务器模型

NIO

NIO Non-blocking I/O 同步非阻塞I/O java中新的I/O模型, 它在读写数据时不会阻塞线程,而是通过轮询的方式检查是否有数据可读写,适用于并发量较高的场景
它的核心是Selector 和Channel ,利用Selector监听多个Channel上的事件,当一个Channel 上的事件到达时,它会被Selector转发给注册在这个Selector上的其他Channel,这样可以用一个线程处理多个请求,提高了I/O效率,NIO适用于连接数多、链接时间段的场景,例如实时聊天,在线游戏等

在java中的springboot 内嵌的tomcat 默认采用的就是NIO 这种模型
核心类:Http11Processor Http11NioProtocol NioEndpoint

LimitLatch: 连接控制器
Acceptor: 负责接收链接
Poller: 负责轮询PollerEvent队列,默认1个线程执行,将就绪的事件生成SocketProcessor 交给Executor(Tomcat 实现的ThreadPoolExecutor 内部的Executor) 去执行
SocketProcessor: 相当于是Workder 判断Socket握手状态和SocketEvent状态,对Socket执行读写操作,是真正的Request 和Response处理类(发起类)
Executor: Tomcat实现的ThreadPoolExecutor 工作线程池。核心线程数默认10, 最大线程数默认200, 线程存活时间60s, 使用链表阻塞队列,自定义的线程工作

AbstractEndpoint.java 中的
NioEndpoint  extends AbstractEndpoint 
// 创建内部的线程池
public void createExecutor() {
	// 是否使用内部线程池
	internalExecutor = true;
	// 创建任务队列
	TaskQueue taskqueue = new TaskQueue();
	TaskThreadFactory tf = new TaskThreadFactory(getName()+"-exec-",daemon,getThreadPriority());
	// coreThreads 10 maxThreads 200 keepAliveTime 最大空闲时间 60s
	executor = new ThreadPoolExecutor(getMinSpareThreads(),getMaxThreads(),60,TimeUnit.SECONDS,tasqueue,tf);
	taskqueue.setParent((ThreadPoolExecutor) executor);
}

Executor 中的线程,执行SocketProcessor 的逻辑,从Socket 中读取HTTP Request,然后解析成HttpServletRequest 对象,再分派到相应的Servlet完成逻辑,最后将Response 通过Socket发回给客户端
从Socket中读和写数据,不是在NIO 模式下注册读和写事件到Selector复用器上,而是直接通过Socket来完成读写的,这个过程是阻塞的。 此处还稍微有点不太理解

附图tomcat 内部NIO模型一张
在这里插入图片描述

AIO

AIO (Asynchronous IO) 是jdk7引入I/O模型
异步非阻塞IO,它的特点是异步处理I/O操作,
当操作完成时会通知应用程序,相比于NIO的同步非阻塞IO,AIO在读写操作时不需要像NIO一样一直轮询,而是通过回调函数的方式在数据准备好后通知应用程序进行数据的读取,可以更加高效的利用系统资源,提高吞吐量,从而提高了IO的效率
但是AIO 在处理小文件和小数据量时的性能不如NIO
所以AIO适用于高并发且处理较大数据量,连接数多,链接时间长的场景, 例如HTTP长链接,文件操作等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值