Я хочу знать, как и когда поток перемещается вперед и назад между запущенными и запущенными состояниями. Что на самом деле происходит за сценой. Я думаю, это понадобится в случае ThreadPool, но я не могу полностью понять. Пожалуйста, помогите мне это понять.Как поток переходит из состояния runnable?
ответ
если поток находится в рабочем состоянии, что означает, что его выполнение запуска() метод и когда его в работоспособный метод его метод запуска 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 означает, что он закончен.
Yield
- статический метод, который сообщает текущему исполняемому потоку, чтобы дать возможность тем, которые имеют равный приоритет в пуле потоков.
Нет гарантии, что Yield
немедленно выполнит текущую выполняющуюся нить. Помните важный момент, что метод yield не приводит поток в состояние Wait или Blocked. Он может только сделать поток из Running State в Runnable State.
'yield()' редко вызывается, и это, конечно, не главный механизм работы здесь. Не используйте форматирование кода для текста, который не является кодом. – EJP
@Anand ..... спасибо за объяснение. Просто еще одно сомнение .... мы будем использовать доход вручную в нашем коде ... правильно? Как JVM позаботится об этом самостоятельно? –
* «Нет гарантии, что Yield сделает текущую исполняемую нить в состоянии runnable немедленно». * ... Действительно. Было бы вполне приемлемо, если бы JVM вообще ничего не делал при вызове Thread.yield(). Программа, которая зависит от поведения Thread.yield() для ее правильности, - это не переносная программа в лучшем случае, а также крайне ошибочная программа в худшем случае. – scottb
Выписка из Руководства программиста на 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
Зачем вам нужно знать? Я тоже этого не знаю, но успешно использовал «ThreadPool» без таких знаний. –
Мне было просто интересно ..... если поток находится в рабочем состоянии, что означает его исполняемый метод run(), и когда его в runnable методе выполняется его метод start() .... поэтому, я думаю, переход от бега к runnable означает его возвращаясь из run(), чтобы начать() .... пожалуйста, поправьте меня, если я ошибаюсь, поскольку я начинаю многопоточность –
Мне нравится этот вопрос, и если это не обман, я голосую, чтобы держать его открытым. –