multithreading - JDK 中的异步 NIO 是如何工作的?
问题描述
在 JVM 中,线程只是原生操作系统线程的薄包装。并且本机操作系统线程占用空间很大,创建它们/在它们之间切换并不是一项轻量级的任务。为了克服这个缺点,JDK 中引入了异步 NIO,它在任务等待时将线程返回到线程池。一旦任务结束,就会从线程池中提取另一个线程来执行任务。
系统怎么知道任务结束了?该任务可能正在等待来自 HTTP 服务器的响应。但是既然线程已经返回到线程池中,谁来中断CPU通知任务完成,可以继续工作呢?
解决方案
线程不会返回到线程池。
如果您指的是选择器,那么您有一个可以服务多个连接的线程。这称为多路复用 IO,在 Linux 上,Linux epoll 系统位于底层。这个线程是你自己来控制的。
因此,您的线程在选择器上的某个事件循环中运行。如果没有任何准备就绪(例如可用于在套接字中读取的数据),它将等待,一旦数据进入,选择器将唤醒线程,然后线程可以处理每个准备好处理的选择键。这样一个线程可以同时处理一堆连接。
伪代码:
for(;;){
int count = selector.select();
if(count>0){
for(SelectionKey key: selector.getReadySet()){
process(key);
}
}
}
上面的循环是在你自己的线程中运行的。
推荐阅读
- scala - 蛇游戏scala中的苹果位置
- sql - 在 MS SQL 中验证数据正确性的最佳实践
- node.js - 使用 nodejs 服务器设置 Vue.js
- javascript - 按特定顺序对 JS 数值数组进行排序
- laravel - Laravel 8 基于类的模型工厂
- python - 如何使用 docker 高效地输入文件
- python - 谁能告诉我如何用相同的按钮解决 python gui tkinter 但在不同的 MySQL 表中单独工作
- java - MTLS 和 http 客户端连接池使用情况
- sql - 我们可以更新 SQL 中除一列之外的所有列吗?
- c# - 使用 FileStream 从原始文件中读取从“开始”到“停止”的十六进制值