Как поток переходит из состояния running в состояние runnable?

Я хочу знать, как и когда поток перемещается между состояниями runnable и running.Что на самом деле происходит за кулисами.Я думаю, это будет необходимо в случае ThreadPool, но я не могу понять полностью.Пожалуйста, помогите мне понять это.

3 ответов


если поток находится в запущенном состоянии, что означает его выполнение run() метод и когда его в runnable метод его выполнение start () метод....поэтому я предполагаю, что переход от запуска к runnable означает его возвращение от run () к start ()

в номенклатуре большинства операционных систем " запуск "означает, что поток фактически выполняет инструкции на некотором процессоре, а "запускаемый" означает, что ничто не мешает потоку "работать", кроме доступности процессора для продолжаться.

программа Java не может сказать разницу между этими двумя состояниями. Поток утверждает, что Java знает о новых, запускаемых, заблокированных, ожидающих, TIMED_WAITING и завершенных.

поток является новым до t.start() называется, и он никогда не может вернуться к новому позже. Ожидание и TIMED_WAITING оба означают, что поток ждет notify() вызовите другой поток. Заблокировано означает, что он ждет чего-либо еще (например, ввести synchronized блока), и Конец означает, что все кончено.


Yield - это статический метод, который указывает текущему исполняемому потоку дать шанс потокам, имеющим равный приоритет в пуле потоков.

нет никакой гарантии, что Yield сделает текущий выполняющийся поток в состоянии runnable немедленно. Помните важный момент, что метод yield не заставляет поток переходить в состояние ожидания или блокировки. Он может только сделать поток из состояния Running в состояние Runnable.


извлечение из руководства программиста по сертификации Java SCJP: Threads:

статический недействительным выход() Этот метод заставляет текущий поток временно приостановить его выполнение и, таким образом, разрешить выполнение других потоков. Решение о том, произойдет ли и когда этот переход, зависит от СПМ.

статической силы сна (долгое МС) выдает InterruptedException Текущий поток спит в течение указанного времени, прежде чем он получит право на запуск снова.

final void join () выбрасывает исключение InterruptedException final void join (long millisec) вызывает исключение InterruptedException Вызов любого из этих двух методов, вызванных в потоке, будет ждать и не вернется, пока поток не завершится или не истечет время ожидания после указанного времени соответственно.

прерывание void() Метод прерывает поток, в котором он вызывается. В состояниях ожидание уведомления, спящий режим или заблокирован для завершения соединения поток будет получите выдачей InterruptedException.

ниже пример иллюстрирует переходы между состояниями потока. Поток в (1) немного спит в (2), а затем выполняет некоторые вычисления в цикле в (3), после чего поток завершается. Метод main () отслеживает поток в цикле at (4), печатая состояние потока, возвращаемое методом getState (). Выходные данные показывают, что поток проходит через состояние RUNNABLE, когда метод run () начинает выполняться, а затем переходит в TIMED_WAITING состояние для сна. При пробуждении он вычисляет цикл в состоянии RUNNABLE и переходит в завершенное состояние, когда метод run() завершается.

Пример: Состояния Потока

public class ThreadStates {

  private static Thread t1 = new Thread("T1") {    // (1)
    public void run() {
      try {
        sleep(2);                                  // (2)
        for(int i = 10000; i > 0; i--);            // (3)
      } catch (InterruptedException ie){
        ie.printStackTrace();
      }
    }
  };

  public static void main(String[] args) {
    t1.start();
    while(true) {                                  // (4)
      Thread.State state = t1.getState();
      System.out.println(state);
      if (state == Thread.State.TERMINATED) break;
    }
  }
}

возможный выход из программы:

RUNNABLE
TIMED_WAITING
...
TIMED_WAITING
RUNNABLE
...
RUNNABLE
TERMINATED