是否应将java NIO Selector.select()阻塞的线程视为等待或运行

时间:2009-10-04 13:40:54

标签: java multithreading nio

selectorObj.select()方法状态

的文档
  

此方法执行阻止   选择操作。它只返回   在至少一个频道之后   选中,这个选择器的唤醒   调用方法,或当前   线程被打断,以先到者为准   第一

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

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

请告诉我为什么我的假设可能出错。

3 个答案:

答案 0 :(得分:1)

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

大多数分析器只显示线程状态,定义为

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

如您所见,线程的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

Cacheonix In-Memory Data Grid