# 简介

前面三种 IO 模型:阻塞式同步,非阻塞式同步,多路复用都是采用的应用主动询问操作系统。也就导致他们都会在执行 read 函数中阻塞住。

异步 IO 采用的是 “订阅 - 通知” 模式:应用程序向操作系统注册 IO 监听,然后继续做自己的事情,当操作系统发生 IO 事件,并且准备好数据后,再主动通知应用程序,触发相应的函数。

异步 IO 也是操作系统进行支持的,Windows 系统提供的异步 IO 技术为 IOCP (I/O Completion Port,I/O 完成端口)。Linux 使用的是 epoll 多路复用 IO 技术模拟异步 IO。

# Java 对异步 IO 的支持

通常我们使用线程池用于执行异步任务,提交任务的线程讲任务提交到线程池就可以立马返回,不必等到任务正在完成,等我们需要执行结果时,通过传递一个回调函数的方式,任务结束后调用这个函数(FutureTask)。

Java 中的异步 IO 也是一样的,都是由一个线程池来负责执行任务,然后使用回调或自己去查询结果。