首页 > 解决方案 > JDK 中的异步 NIO 是如何工作的?

问题描述

在 JVM 中,线程只是原生操作系统线程的薄包装。并且本机操作系统线程占用空间很大,创建它们/在它们之间切换并不是一项轻量级的任务。为了克服这个缺点,JDK 中引入了异步 NIO,它在任务等待时将线程返回到线程池。一旦任务结束,就会从线程池中提取另一个线程来执行任务。
系统怎么知道任务结束了?该任务可能正在等待来自 HTTP 服务器的响应。但是既然线程已经返回到线程池中,谁来中断CPU通知任务完成,可以继续工作呢?

标签: multithreadingjvmthreadpool

解决方案


线程不会返回到线程池。

如果您指的是选择器,那么您有一个可以服务多个连接的线程。这称为多路复用 IO,在 Linux 上,Linux epoll 系统位于底层。这个线程是你自己来控制的。

因此,您的线程在选择器上的某个事件循环中运行。如果没有任何准备就绪(例如可用于在套接字中读取的数据),它将等待,一旦数据进入,选择器将唤醒线程,然后线程可以处理每个准备好处理的选择键。这样一个线程可以同时处理一堆连接。

伪代码:

for(;;){
   int count = selector.select();
   if(count>0){
       for(SelectionKey key: selector.getReadySet()){
         process(key);
       }
   }
}

上面的循环是在你自己的线程中运行的。


推荐阅读