2014-11-16 2 views
1

Я ищу проверки/аргументы на следующее:В каком состоянии находится спальная нить?

Нить в точности один из 5 (+1 - 2 для WAITING) states в любой момент времени.

Пусть волоске T вызовы

Thread.sleep (3000);

и, таким образом, погружается в сон на 3 секунды.

В каком состоянии оно находится в течение этих 3 секунд?

Очевидно, что start() -ed и по-прежнему жив, поэтому не является NEW или TERMINATED.

Он не ждет ни одного замка. Фактически, он не выпустил ни одного замка, который он имел перед этим вызовом, поэтому это не BLOCKED.

Это не ждет другой темы. Ожидает себя в некотором смысле - но это не спецификация состояния WAITING. То, что получает поток в состояние WAITING, является одним из вызовов: Object.wait(), Thread.join() и LockSupport.park().

Таким образом, это должно быть RUNNABLE - единственное, что осталось от состояний резьбы. Однако RUNNABLE - это состояние, выполняемое потоком на JVM - включено для времени процессора и, следовательно, для сжигания ресурсов. Спящая нить, находящаяся на графике процессора, кажется противоречивой.

У меня что-то отсутствует?

TIA.

+1

Он заблокирован, он ждет ОС, чтобы разбудить его для ввода/вывода. –

+0

Re "RUNNABLE - это состояние, выполняемое потоком на JVM", True, когда вы говорите о потоке библиотеки Java.getState(), но на всякий случай вам интересно; в номенклатуре многих операционных систем «runnable» означает, что поток «не работает», потому что он ожидает, что доступный процессор будет запущен. –

ответ

6

Javadoc из Thead.State.TIMED_WAITING reads:

состояние резьбы для ожидающего потока с заданным временем ожидания. Поток находится в таймерном состоянии ожидания из-за вызовом одного из следующих методов с заданным положительным временем ожидания:

  • Thread.sleep
  • Object.wait с таймаутом
  • Thread.join с таймаутом
  • LockSupport.parkNanos
  • LockSupport.parkUntil

И действительно, следующая тестовая программа печатает TIMED_WAITING:

public class Test { 
    public static void main(String[] args) throws Exception { 
     Thread t = new Thread() { 
      public void run() { 
       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      }; 
     }; 
     t.start(); 
     Thread.sleep(100); // make sure the other thread has started 
     System.out.println(t.getState()); 
    } 
} 
+1

thx для полезных анс. прочитайте только ОЖИДАНИЕ - все время проходите по TIMED_WAITING. – Roam

+0

Точно подобная вещь произошла со мной, и это привело меня сюда по этому вопросу. –

Смежные вопросы