|
|
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
JDK декларирует 6 дискретных состояний для Thread. https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html Насколько я понимаю yield сохраняет состояние Runnable а sleep переводит поток в другое состояние. Можно погуглить по ключевым словам Java thread Diagram но я к сожалению находил много противоречивых и разных картинок. Может Блажкович подскажет актуальную где диаграмма переходов будет верной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 10:30 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
mayton, SCJPyield() is supposed to do is make the currently running thread head back to runnable to allow other threads of the same priority to get their turn. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 10:53 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
Я не спорю пока. Просто привожу еще один источник. На мой взгляд более первичный. https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html Thread.sleep causes the currently executing thread to sleep (temporarily cease execution) for the specified duration, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors, and resumption of execution will depend on scheduling and the availability of processors on which to execute the thread. It is important to note that neither Thread.sleep nor Thread.yield have any synchronization semantics. In particular, the compiler does not have to flush writes cached in registers out to shared memory before a call to Thread.sleep or Thread.yield, nor does the compiler have to reload values cached in registers after a call to Thread.sleep or Thread.yield. Вот мой вариант перевода. (Прошу не ругать за неточность а прост поправить как надо). Thread.sleep вызывает в текущем потоке временное прекращение исполнения на указанную длительность времени с учотом возможностей и аккурстности системных таймеров и планировщиков. Поток не теряет право владения никакими мониторами и возобновление исполнения будет зависеть от планирования имеющихся в наличии процессоров на которых исполняется поток. Важно отметить что Thread.sleep и Thread.yield не имеют никакого смысла с точки зрения синхронизации. В частности компиллятор не должен сбрасывать записи в регистрах в разделяемую память до вызова Thread.sleep или Thread.yield..... (далее незарборчиво)..... компиллятор не должен перегружать значения кешируемые в регистрах после вызова Thread.sleep или Thread.yield. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 11:37 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
sleep() не использует cpu, но не оствобождает монитор, в этом смысле wait - лучше короче говоря, польза от yield сомнительная, с учетом того, что он зависbт и от os и от типа jvm. кроме того, встречать в интернетах реальное применение этого метода мне как-то не доводилось (если конечно конкретно его не искать), потому что везде используют sleep(). p.s. хороший вопрос на соб-ии - кого хош можно запутать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 11:52 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
Это хороший вопрос. Он не однозначен для целого спектра JVM. Если заниматься буквоедством то "хинт" - это не команда а подсказка. Тоесть language/VM оставляет за собой право действовать на усмотрение. Таким образом удаление из кода yield() собственно не должно приводить к нарушению логики. В крайнем случае будет некое изменение соотношения "пропускной способности" и "отзывчивости". Материи... согласитесь весьма зыбкие для вопроса на собеседовании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 12:01 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
rema174, а также jvm может заменить yield на sleep, a sleep(0) на yield, зависит и от os и от типа jvm. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 12:10 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
Разница в первую очередь семантическая. sleep он придуман для другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 13:06 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
забыл никРазница в первую очередь семантическая. sleep он придуман для другого. Отлично сказано! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 13:18 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
rema174В этом смысле, как заметил Basil, если sleep() - проблемы на ровном месте, то при каких условиях и как их заметить?Если вы ставите Thread.sleep(1), то Thread.yield() делает, в общем-то, тоже самое, но чуть "производительнее"; Если вы ставите Thread.sleep(много), организуя "таймер", то единственный способ досрочно завершить ожидание - вызов нестатического метода interrupt. Что будем делать, если не мы управляем пулом потоков, а (какой-нибудь) контейнер? Метод wait есть у любого объекта и хотя организовывать задержку с его помощью - несколько больше кода, в отсутствии готовых таймеров использовать надо именно wait(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 15:59 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
wait конечно очень крут и концептуален но рискну предположить что без sleep мы не напишем планировщик (cron / scheduler) ибо кто-то на самом верхнем уровне всё-таки "стоит с секундомером". И вобщем-то в любых языках и средах и системах программирования существует вошебная команда "ничего не делать" / вращать спин несколько микро-единиц времени для обеспечения задач микро-контроля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 18:56 |
|
||
|
Thread.yeald() - зачем он нужен?
|
|||
|---|---|---|---|
|
#18+
Если заглянуть в исходники, то несложно заметить, что и wait() и sleep() - нативные методы. Если учесть, что второй - static, то можно обоснованно предположить, что он "просто ждёт", а вот первый - работает и с планировщиком ява-машины и с мониторами объекта, на котором выполняется ожидание так, как это продекларировано в документации. Именно поэтому wait() позволяет строит более-менее сложные схемы ожидания и тривиально реализовывать полезные вещи типа "досрочный запуск ждущей задачи". В общем, я повторю, что sleep(1) должен заменяться на yield(), а в большинстве остальных случаев, по здравому размышлению, должен использоваться wait() с обвязкой, реализующую нужную логику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 15:07 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38931844&tid=2125556]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 355ms |

| 0 / 0 |
