2013-02-24 3 views
1

Может ли кто-нибудь объяснить разницу между методом Thread.yield() и Thread.sleep()?Разница между Thread.yield() и Thread.sleep()

Как я понимаю: Thread.yield() отдает блокировку монитора другому потоку, который JVM решает выполнить дальше, а Thread.sleep() помещает текущий поток в спящий режим на заданное количество миллисекунд, не отбрасывая блокировку монитора.

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield() –

+0

«Thread.yield() отказывается от блокировки монитора». Нет, нет. Откуда у вас эта идея? – EJP

+0

Мне просто интересно ... если Thread.yield не перестает блокировать монитор. Как может любой другой поток продолжить выполнение, если другой поток имеет высокий приоритет.? – ASingh

ответ

11

Это зависит от того, что Java версии вы используете, в соответствии с this:

В Java 5, Thread.yield() называет Windows API, Sleep(0). Это имеет специальный эффект очистки кванта текущего потока (количество выделенных временных отрезков ЦП ) и помещение его в конец очереди для его уровня приоритета. Другими словами, все исполняемые потоки одного и того же приоритета (и те из них, которые имеют более высокий приоритет) получат возможность запускать до того, как полученный поток станет следующим заданным временем процессора. Когда это в конечном итоге перепланировано, оно вернется с полным квантом, но не «переносит» любой оставшийся квант с момента получения . Это поведение немного отличается от ненулевого сна , где спящая нить обычно теряет 1 квантовое значение (фактически, 1/3 от 10 или 15 мс тика).

В Java 6 это поведение было изменено. В настоящее время виртуальная машина Hotspot реализует Thread.yield() с помощью вызова API Windows SwitchToThread(). Этот вызов заставляет текущий поток отбрасывать свой текущий срез времени, но не весь его квант. Это означает, что в зависимости от приоритетов другие потоки, доходная нить может быть запланирована в один период прерывания позже.


Thread.sleep() приостанавливает текущий поток в течение определенного времени, независимо от того, что Java версия, которую вы используете.

+0

Ваш ответ гораздо более всеобъемлющий, чем мой. Престижность. :) Я подозреваю, что другие операционные системы имеют такие же отличия, как и для Windows. +1 от меня. – ATrubka

+0

Спасибо, и на других ОС системные вызовы имеют тот же эффект, да. – syb0rg

+2

Если вы собираетесь копировать слова других, обязательно цитируйте их и добавьте правильную атрибуцию. Я сделал это в вашем ответе выше. –

0

Thread.sleep() помещает вашу нить в течение определенного периода времени или до прерывания. Thread.yield() не помещает ваш поток в режим сна. Вместо этого он временно приостанавливает поток, чтобы другие потоки выполняли свою работу.

-1

Закрыть. Thread.sleep заставляет поток спать в течение указанного времени, но не отказывается от блокировки.

Thread.yield также не отказывается от блокировки. Он просто намекает на планировщик потоков, чтобы дать другому потоку несколько циклов.

Они действительно совсем не похожи друг на друга, они очень разные.

Есть ли конкретная проблема, которую вы пытаетесь решить?

+0

Спасибо, Виктор. Я новичок в JAVA-параллелизме, поэтому я просто хотел изучить основы. – ASingh

+0

Мне просто интересно ... если Thread.yield не откажется от блокировки монитора. Как может любой другой поток продолжить выполнение, если другой поток имеет высокий приоритет.? – ASingh

+1

Почему вы предполагаете, что поток держит замок? Если он держит замок, тогда вы правы, он не откажется от блокировки. Но это все равно намекает на планировщик потоков, чтобы дать некоторые циклы другим потокам. Просто не дожидайтесь этого замка. –

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