2016-01-20 1 views
6

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

+1

Зачем вам нужно знать? Я тоже этого не знаю, но успешно использовал «ThreadPool» без таких знаний. –

+0

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

+0

Мне нравится этот вопрос, и если это не обман, я голосую, чтобы держать его открытым. –

ответ

6

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

В номенклатуре большинства операционных систем «запуск» означает, что поток фактически выполняет инструкции на каком-то процессоре, а «runnable» означает, что ничто не мешает потоку «работать», за исключением доступности CPU для запуска.

Программа Java не может отличить эти два состояния. В потоке указано, что Java знает об этом: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING и TERMINATED.

Нить до NEW t.start() называется, и она никогда не может вернуться в NEW после этого. WAITING и TIMED_WAITING означают, что поток ожидает вызова notify() в каком-то другом потоке. BLOCKED означает, что он ждет чего-нибудь еще (например, для ввода блока synchronized), а TERMINATED означает, что он закончен.

0

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

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

+0

'yield()' редко вызывается, и это, конечно, не главный механизм работы здесь. Не используйте форматирование кода для текста, который не является кодом. – EJP

+0

@Anand ..... спасибо за объяснение. Просто еще одно сомнение .... мы будем использовать доход вручную в нашем коде ... правильно? Как JVM позаботится об этом самостоятельно? –

+0

* «Нет гарантии, что Yield сделает текущую исполняемую нить в состоянии runnable немедленно». * ... Действительно. Было бы вполне приемлемо, если бы JVM вообще ничего не делал при вызове Thread.yield(). Программа, которая зависит от поведения Thread.yield() для ее правильности, - это не переносная программа в лучшем случае, а также крайне ошибочная программа в худшем случае. – scottb

0

Выписка из Руководства программиста на Java SCJP сертификации: Темы:

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

статический недействительный спящий режим (длинные миллисекунды) Прерывание Исключение Текущий поток спит в течение указанного времени, прежде чем он снова будет допущен к запуску.

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

void interrupt() Метод прерывает поток, на который он вызывается. В состояниях «Ожидание для уведомления», «Спящий» или «Заблокированные для соединения» поток будет получать прерывание Exception.

Ниже приведен пример переходов между состояниями резьбы. Поток в (1) немного спящий в (2), а затем выполняет некоторые вычисления в цикле в (3), после чего поток завершается. Метод main() контролирует поток в цикле в (4), печатая состояние потока, возвращаемое методом getState(). Вывод показывает, что поток проходит через состояние RUNNABLE, когда метод run() начинает выполнение, а затем переходит в состояние TIMED_WAITING для сна. При пробуждении он вычисляет цикл в состоянии RUNNABLE и переходит в состояние TERMINATED при завершении метода 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