java - 被 java NIO Selector.select() 阻塞的线程应该被视为等待还是正在运行

标签 java multithreading nio

selectorObj.select() 方法的文档说明

This method performs a blocking selection operation. It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

我理解文档 被select方法阻塞的线程,不应该等待吗?当我运行探查器时,我看到线程处于运行模式而不是等待状态。

虽然,我接受这一点,但没有提到线程应该处于等待状态,但我的假设是,直到信号调度程序线程提供一些与选择器注册的 channel 上的任何 Activity 有关的输入;线程应该处于等待状态。

请为我提供一些帮助,说明为什么我的假设可能是错误的。

最佳答案

当线程在 I/O 调用中被阻塞时,就 Java 线程而言,它仍然在运行。

大多数探查器只是显示线程状态,其定义为,

  • NEW 尚未启动的线程处于此状态。
  • RUNNABLE 正在执行的线程 Java虚拟机在这个 状态。
  • BLOCKED 被阻塞的线程 等待监视器锁就在这 状态。
  • WAITING 正在等待的线程 无限期地让另一个线程 执行特定操作是在 这种状态。
  • TIMED_WAITING 一个线程 等待另一个线程执行 最多指定的操作 等待时间就处于这个状态。
  • TERMINATED 已退出的线程 就处于这种状态。

如您所见,线程的 WAITING/BLOCKED 状态与 I/O 无关。

关于java - 被 java NIO Selector.select() 阻塞的线程应该被视为等待还是正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57164608/

相关文章:

c++ - 在并行 C++ 中调用函数

Java NIO Files.createFile() 失败并出现 NoSuchFileException

java - Files.exists(path) 和 path.toFile().exists() 对同一个文件给出不同的结果

java - Spring Boot Data REST、HATEOAS 无法使用自定义 Controller

java - 使用 OpenCv 和 android 进行图像识别

java - 动态创建多个列表

java - 如何将 FTPClient.getModificationDate() 解析为 Java 日期

python - 减少 wxPython GUI 加载时间的方法

C++ 在监 window 口中查看互斥量值

Java、C++、NIO、mmaped 缓冲区、同步