selectorObj.select()
方法状态 的文档
此方法执行阻塞选择操作。它仅在至少选择一个通道、调用此选择器的唤醒方法或当前线程被中断(以先到者为准)后才返回。
我了解文档选择方法阻塞的线程,不应该等待吗?当我运行探查器时,我看到线程处于运行模式而不是等待状态。
虽然,我接受这一点,但没有提到线程应该处于等待状态,但我的假设是,直到信号调度程序线程提供一些关于在选择器注册的通道上的任何活动的输入;线程应该处于等待状态。
请为我提供一些帮助,说明为什么我的假设可能是错误的。
selectorObj.select()
方法状态 的文档
此方法执行阻塞选择操作。它仅在至少选择一个通道、调用此选择器的唤醒方法或当前线程被中断(以先到者为准)后才返回。
我了解文档选择方法阻塞的线程,不应该等待吗?当我运行探查器时,我看到线程处于运行模式而不是等待状态。
虽然,我接受这一点,但没有提到线程应该处于等待状态,但我的假设是,直到信号调度程序线程提供一些关于在选择器注册的通道上的任何活动的输入;线程应该处于等待状态。
请为我提供一些帮助,说明为什么我的假设可能是错误的。
当线程在 I/O 调用中被阻塞时,就 Java 线程而言,它仍在运行。
大多数分析器只显示线程状态,定义为,
如您所见,线程的 WAITING/BLOCKED 状态与 I/O 无关。
通常,选择操作会调用 poll(...) 系统函数。
select() 为内核提供了一个文件描述符列表,它需要监视读/写/错误条件以及超时值。内核使用相关通道的选择函数注册进程/线程,并使进程/线程进入睡眠状态。一旦关联的通道准备好或计时器到期,内核就会唤醒注册的进程/线程。请注意,此线程是内核线程,而不是 java 应用程序线程。
我看不到执行 select 的线程处于 WAIT 状态的原因(除非 Selector 提供程序返回的 Selector 的实现明确地在 select() 函数中进行了等待)。
这取决于分析器。JProfiler 将选择器线程在 Selector.select() 上阻塞的时间显示为“网络 I/O”。因此,将阻塞的 Selector.select() 解释为“等待数据”的最佳方式。
希望这可以帮助。
问候,
斯拉瓦·伊梅舍夫