在 JVM 中,线程只是原生操作系统线程的薄包装。并且 native 操作系统线程占用空间很大,创建它们/在它们之间切换并不是一项轻量级的任务。为了克服这个缺点,JDK 中引入了异步 NIO,它在任务等待时将线程返回到线程池。一旦任务结束,就会从线程池中提取另一个线程来执行任务。
系统怎么知道任务结束了?该任务可能正在等待来自 HTTP 服务器的响应。但是既然线程已经返回到线程池中,谁来中断CPU通知任务完成,可以继续工作呢?
最佳答案
线程不会返回到线程池。
如果您指的是选择器,那么您有一个可以服务多个连接的线程。这称为多路复用 IO,在 Linux 上,Linux epoll 系统位于底层。这个线程是你自己来控制的。
因此,您的线程在选择器上的某个事件循环中运行。如果没有任何准备就绪(例如可用于在套接字中读取的数据),它将等待,一旦数据进入,选择器将唤醒线程,然后线程可以处理准备好处理的每个选择键。这种方式一个线程可以同时处理一堆连接。
伪代码:
for(;;){
int count = selector.select();
if(count>0){
for(SelectionKey key: selector.getReadySet()){
process(key);
}
}
}
上面的循环是在你自己的线程中运行的。
关于multithreading - JDK 中的异步 NIO 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65490456/