multithreading - JDK 中的异步 NIO 是如何工作的?

标签 multithreading jvm threadpool

在 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/

相关文章:

jakarta-ee - @Asynchronous EJB 线程池配置

java - 使用 ThreadPoolExecutor 时看不到 CPU Bound 任务的上下文切换开销

iphone - 重新排序 NSOperationQueue

dynamic - invokedynamic 什么时候真正有用(除了惰性常量)?

c - pthreads:等到 read() 返回值 > 0

java - java进程中提交内存和RSS的差异

java - JVM 在具有相同标志的情况下运行方式非常不同

python - python pool.map 中的多线程引发 TypeError : object of type 'float' has no len()

java - ActiveMQ KahaDB 总是锁定和等待

c++ - Qt SQL 线程数据库查询