Если поток, заблокированный Java NIO Selector.select (), считается ожидающим или работающим - PullRequest
0 голосов
/ 04 октября 2009

Документация selectorObj.select() состояний метода

Этот метод выполняет блокировку операция выбора. Возвращается только после того, как хотя бы один канал выбран, это пробуждение селектора метод вызывается или текущий поток прерывается, в зависимости от того, что приходит первый.

я понимаю документацию Поток, заблокированный методом выбора, не должен ждать? Когда я запускаю профилировщик, я вижу, что поток находится в режиме выполнения, а не в состоянии ожидания.

Хотя, я принимаю это, не упоминается, что поток должен находиться в состоянии ожидания, но я предполагаю, что до тех пор, пока поток диспетчера сигналов не предоставит некоторый ввод в отношении любой активности на канале, зарегистрированном селектором; поток должен находиться в состоянии ожидания.

Пожалуйста, помогите мне понять, почему мое предположение может быть неверным.

Ответы [ 3 ]

1 голос
/ 04 октября 2009

Когда поток заблокирован в вызове ввода-вывода, он все еще работает, насколько это касается потока Java.

Большинство профилировщиков просто показывают состояние потока, которое определяется как

  • NEW Поток, который еще не запущен, находится в этом состоянии.
  • RUNNABLE Поток, выполняющийся в Виртуальная машина Java находится в этом государство.
  • BLOCKED Нить, которая заблокирована в ожидании блокировки монитора в этом государство.
  • WAITING Ожидающая нить на неопределенный срок для другого потока выполнить определенное действие в это состояние.
  • TIMED_WAITING Поток, который ожидание другого потока для выполнения действие до указанного время ожидания в этом состоянии.
  • TERMINATED Нить, которая вышла находится в этом состоянии.

Как видите, состояние потока WAITING / BLOCKED не имеет ничего общего с вводом / выводом.

0 голосов
/ 12 января 2012

Зависит от профилировщика. JProfiler показывает время, когда поток селектора заблокирован в Selector.select () как «Сетевой ввод / вывод». Таким образом, лучший способ интерпретировать заблокированный Selector.select () как «Ожидание данных».

Надеюсь, это поможет.

С уважением,

Слава Имешев

Сетка данных Cacheonix в памяти

0 голосов
/ 08 октября 2009

Обычно операция выбора вызывает системную функцию poll (...).

select () предоставляет ядру список файловых дескрипторов, которые необходимо отслеживать для условий чтения / записи / ошибки, а также значение времени ожидания. Ядро регистрирует процесс / поток с помощью функции выбора связанного канала и переводит процесс / поток в спящий режим. Как только соответствующий канал готов или таймер истек, ядро ​​активирует зарегистрированный процесс / поток. Обратите внимание, что этот поток является потоком ядра, а не потоком приложения Java.

Я не вижу причины, по которой поток, выполняющий select, находится в состоянии WAIT (если только реализация Selector, возвращенная поставщиком Selector, явно не ожидала в функции select ()).

...