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