powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread.yeald() - зачем он нужен?
36 сообщений из 36, показаны все 2 страниц
Thread.yeald() - зачем он нужен?
    #38620887
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чего-то не понимаю смысла метода Thread.yeald()
смотрю пример отсюда:
http://www.tutorialspoint.com/java/lang/thread_yield.htm

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
package com.tutorialspoint;

import java.lang.*;

public class ThreadDemo implements Runnable {

   Thread t;

   ThreadDemo(String str) {

      t = new Thread(this, str);
      // this will call run() function
      t.start();
   }

   public void run() {

      for (int i = 0; i < 5; i++) {
         // yields control to another thread every 5 iterations
            if ((i % 5) == 0) {
               System.out.println(Thread.currentThread().getName() + "
               yielding control...");
               
               /* causes the currently executing thread object to temporarily 
               pause and allow other threads to execute */
               Thread.yield();
            }
      }

      System.out.println(Thread.currentThread().getName() + " has 
      finished executing.");
   }

   public static void main(String[] args) {
      new ThreadDemo("Thread 1");
      new ThreadDemo("Thread 2");
      new ThreadDemo("Thread 3");
   }
} 



out:
авторThread 1 is yielding control...
Thread 2 is yielding control...
Thread 3 is yielding control...
Thread 1 has finished executing.
Thread 2 has finished executing.
Thread 3 has finished executing.



везде пишется, что этот метод позволяет дать исполняться другим потокам. я чего-то не понимаю что в этом примере мешает потокам исполняться параллельно?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38620892
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или это проблема когда потоков сильно больше чем процессорных ядер ?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38620893
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Представьте, что у вас на компьютере 4 ядра, а работают одновременно 16 потоков. В этом случае у вас одновременно работают только 4 потока, а остальные 12 курят. Если вы хотите, что бы один работающий поток передал управление другому "курящему" - тогда вы вызываете Thread.yield().

На практике этот метод не используется. Если вы поищете по JDK, кто его вызывает, то найдете буквально 2-3 библиотечных класса из java.util.concurrent, которые его как-от задействуют в своих хитрых алгоритмах. В обычной жизни толку от него, как правило, нет. Так что можете смело игнорировать существование этого метода :-)
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38620896
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachНа практике этот метод не используется. Если вы поищете по JDK, кто его вызывает, то найдете буквально 2-3 библиотечных класса из java.util.concurrent, которые его как-от задействуют в своих хитрых алгоритмах. В обычной жизни толку от него, как правило, нет. Так что можете смело игнорировать существование этого метода :-)
В J2ME по-моему используется. Там многозадачность кооперативная. А так как Java кросс-платформенное решение, то и в других платформах, вероятно этот метод тоже можно применить в аналогичных случаях.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38620918
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczDEVcoachНа практике этот метод не используется. Если вы поищете по JDK, кто его вызывает, то найдете буквально 2-3 библиотечных класса из java.util.concurrent, которые его как-от задействуют в своих хитрых алгоритмах. В обычной жизни толку от него, как правило, нет. Так что можете смело игнорировать существование этого метода :-)
В J2ME по-моему используется. Там многозадачность кооперативная. А так как Java кросс-платформенное решение, то и в других платформах, вероятно этот метод тоже можно применить в аналогичных случаях.

А мы используем - есть потоки длительные, а есть короткие. Для длительных потоков вызываем yeald в нескольких местах - что бы на долго не стопорить короткие потоки.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38620957
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
// Thread.sleep(1); // D'oh! (c) Simpson
// Thread.sleep(0); // D'oooooh! 
Thread.yield(); // God damn nerds!!!! (c) Homer
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38621938
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerвезде пишется, что этот метод позволяет дать исполняться другим потокам. я чего-то не понимаю что в этом примере мешает потокам исполняться параллельно?yield() сообщает планировщику, что данному потоку процессорное время сейчас не требуется.
Соответственно, планировщик начинает процесс диспетчеризации и может запустить какой-либо из ожидающих потоков, который, в противном случае, ждал бы окончания кванта времени.
Эффект - улучшение реактивности системы. Особенно заметно когда "дисциплинированные" программы "кладут проц на полку" из-за высокой предложенной нагрузки.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930791
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
странно, никто не сказал, что "йилд" ничего не гаранитирует, и в этом смысле вообще не понятно зачем он нужен, если есть Thread.sleep(), который точно сработает
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930800
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174странно, никто не сказал, что "йилд" ничего не гаранитирует, и в этом смысле вообще не понятно зачем он нужен, если есть Thread.sleep(), который точно сработает
А что он должен гарантировать?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930806
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczrema174странно, никто не сказал, что "йилд" ничего не гаранитирует, и в этом смысле вообще не понятно зачем он нужен, если есть Thread.sleep(), который точно сработает
А что он должен гарантировать?

прекратить выполнение текущего потока
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930808
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а точне перевести потов в состояние runnable
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930814
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174прекратить выполнение текущего потока
С какой стати? Это хинт планировщику "если у тебя есть дела поважнее, то можешь ими заняться". А можешь не заняться.
А ещё реализация зависит от ОС и платформы. Если планировщику побоку такие хинты, он может их игнорировать.

Почему ты решил что этот метод что-то прекращает - не понятно.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930847
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html yield()

A hint to the scheduler that the current thread is willing to yield its current use of a processor.
Хинт - это типа подсказка планировщику что текущий поток закончил работу и готов уступить
своё время следующему.

Далее - моё сугубо личное ИМХО: Хинт по всей вероятности возник в эпоху слабых JVM (старые
мобилки, встроенная техника), которые не умели пользовать мультизадачность и понимали только
continuations. Для современных JVM этот хинт скорее всего не нужен.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930855
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174странно, никто не сказал, что "йилд" ничего не гаранитируетУчитесь читать - я выделил курсивом существенные слова.и в этом смысле вообще не понятно зачем он нужен, если есть Thread.sleep(), который точно сработаетЕсть желание подождать - используйте wait(период) класса Object, а sleep(период) это хороший способ поиметь проблемы на ровном месте.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930864
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДля современных JVM этот хинт скорее всего не нужен.Нужен. Точнее - полезен.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930874
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonДля современных JVM этот хинт скорее всего не нужен.Нужен. Точнее - полезен.
Ммм... почти готов согласиться.

Необходим бенчмарк.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930887
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНеобходим бенчмарк.Результат я и так могу сказать - потеряете процент-другой на пропускной способности и получите (намного) более отзывчивую систему в условиях сильной загрузки.
Что лучше становится понятно, когда требуется "что-то делать" на этой системе "в условиях сильной загрузки".
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonНеобходим бенчмарк.Результат я и так могу сказать - потеряете процент-другой на пропускной способности и получите (намного) более отзывчивую систему в условиях сильной загрузки.
Что лучше становится понятно, когда требуется "что-то делать" на этой системе "в условиях сильной загрузки".
Еще раз возвращаясь на несколько постов назад.
Хинт "yield" полезен но для того чтобы оценить его пользу
требуется выбирать между "отзывчивостью" и системы и "пропускной способностью".

Правильно ли я понял мысль?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930915
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПравильно ли я понял мысль?Да, но потери пропускной способности настолько мизерны, что в тех случаях, когда yield() вообще применим, на это можно не обращать внимание.
Скорее "простая человеческая лень" будет решать - появится yield или нет
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38930967
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, у тебя есть еще какие-либо вопросы по применению yield ?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931166
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovsleep(период) это хороший способ поиметь проблемы на ровном месте.
почему? разве sleep(период) не приостановит текущий поток на заданное время, открыв тем самым "дорогу" другим потокам?
и чем он в этом смысле отличаетсятся от йилд, который тоже говорит диспетчеру потоков,что готов уступить "квант времени" другому потоку.
так ли сильно они отличаются?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931184
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174Basil A. Sidorovsleep(период) это хороший способ поиметь проблемы на ровном месте.
почему? разве sleep(период) не приостановит текущий поток на заданное время, открыв тем самым "дорогу" другим потокам?
и чем он в этом смысле отличаетсятся от йилд, который тоже говорит диспетчеру потоков,что готов уступить "квант времени" другому потоку.
так ли сильно они отличаются?
Тем и отличается, что sleep приостановит в любом случае, а yeild, только если шедулер решит что от этого будет польза.
И, как я уже указал выше, реализация зависит от платформы и операционки.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931232
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

может Basil A. Sidorov еще пояснит насчет sleep(период) и проблем на ровном месте
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931370
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174Blazkowicz,
может Basil A. Sidorov еще пояснит насчет sleep(период) и проблем на ровном месте
Потому что при наличии yeild(), sleep() достаточно бесполезная операция в работающем коде. Если она используется, то это либо тестовый код, либо некий кривой костыль. Если у вас есть примеры практического применения sleep(), расскажите.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931418
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Я доселе вообще yield() не использовал, но там где использовался sleep() я понимал почему так делал.
Как я понимаю, sleep() - "попридержать поток", а yield() - делегировать проц-е время. Но тогда применение sleep() тоже делегирует проц-е время, только на конкретный период, а yield() - как диспетчер решит. В этом смысле, как заметил Basil, если sleep() - проблемы на ровном месте, то при каких условиях и как их заметить?
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDK декларирует 6 дискретных состояний для Thread.

https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html

Насколько я понимаю yield сохраняет состояние Runnable а sleep переводит
поток в другое состояние.

Можно погуглить по ключевым словам Java thread Diagram но я к сожалению
находил много противоречивых и разных картинок. Может Блажкович
подскажет актуальную где диаграмма переходов будет верной.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931565
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931644
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не спорю пока. Просто привожу еще один источник. На мой взгляд более первичный.

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.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931683
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sleep() не использует cpu, но не оствобождает монитор, в этом смысле wait - лучше

короче говоря, польза от yield сомнительная, с учетом того, что он зависbт и от os и от типа jvm. кроме того, встречать в интернетах реальное применение этого метода мне как-то не доводилось (если конечно конкретно его не искать), потому что везде используют sleep().

p.s. хороший вопрос на соб-ии - кого хош можно запутать )
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931709
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хороший вопрос. Он не однозначен для целого спектра JVM. Если заниматься буквоедством
то "хинт" - это не команда а подсказка. Тоесть language/VM оставляет за собой право действовать
на усмотрение. Таким образом удаление из кода yield() собственно не должно приводить к нарушению
логики. В крайнем случае будет некое изменение соотношения "пропускной способности" и "отзывчивости".
Материи... согласитесь весьма зыбкие для вопроса на собеседовании.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931730
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

а также jvm может заменить yield на sleep, a sleep(0) на yield, зависит и от os и от типа jvm.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931830
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разница в первую очередь семантическая. sleep он придуман для другого.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38931844
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никРазница в первую очередь семантическая. sleep он придуман для другого.
Отлично сказано!
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38933196
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174В этом смысле, как заметил Basil, если sleep() - проблемы на ровном месте, то при каких условиях и как их заметить?Если вы ставите Thread.sleep(1), то Thread.yield() делает, в общем-то, тоже самое, но чуть "производительнее";
Если вы ставите Thread.sleep(много), организуя "таймер", то единственный способ досрочно завершить ожидание - вызов нестатического метода interrupt.
Что будем делать, если не мы управляем пулом потоков, а (какой-нибудь) контейнер?
Метод wait есть у любого объекта и хотя организовывать задержку с его помощью - несколько больше кода, в отсутствии готовых таймеров использовать надо именно wait().
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38933385
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wait конечно очень крут и концептуален но рискну предположить
что без sleep мы не напишем планировщик (cron / scheduler) ибо
кто-то на самом верхнем уровне всё-таки "стоит с секундомером".
И вобщем-то в любых языках и средах и системах программирования
существует вошебная команда "ничего не делать" / вращать спин
несколько микро-единиц времени для обеспечения задач
микро-контроля.
...
Рейтинг: 0 / 0
Thread.yeald() - зачем он нужен?
    #38934149
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если заглянуть в исходники, то несложно заметить, что и wait() и sleep() - нативные методы.
Если учесть, что второй - static, то можно обоснованно предположить, что он "просто ждёт", а вот первый - работает и с планировщиком ява-машины и с мониторами объекта, на котором выполняется ожидание так, как это продекларировано в документации.
Именно поэтому wait() позволяет строит более-менее сложные схемы ожидания и тривиально реализовывать полезные вещи типа "досрочный запуск ждущей задачи".
В общем, я повторю, что sleep(1) должен заменяться на yield(), а в большинстве остальных случаев, по здравому размышлению, должен использоваться wait() с обвязкой, реализующую нужную логику.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread.yeald() - зачем он нужен?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]