Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разница между Thread.sleep и Thread.yield 
V
    Опции темы
zone51
  Дата 16.10.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Привет  всем. Подскажите пожалуйста принципиальное различие между Thread.yield и Thread.sleep
Спасибо

 smile  smile  smile 


--------------------
The truth is out there
PM MAIL   Вверх
math64
Дата 16.10.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



yield - отдать управление другим потокам, без указания времени, когда управление должно вернутьс к текущему потоку.
sleep - задержка на указанное время.
PM   Вверх
zone51
Дата 16.10.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



math64, 
Спасибо большое. Получается yield() и sleep(0) эквивалентны ?


--------------------
The truth is out there
PM MAIL   Вверх
intr
Дата 16.10.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.12.2005

Репутация: 1
Всего: 2



Цитата из http://www.skipy.ru/technics/synchronization.html
Цитата

И последнее, чего бы я тут хотел коснуться – статический метод yield. Он служит для передачи управления другим потокам. Т.е. в результате его вызова происходит переключение контекста и процессор начинает исполнять код другого потока. Это нужно как в ситуациях, когда работа на текущий момент завершена и можно дать поработать другим (например, поток обрабатывает данные, все обработал, а новые еще не пришли), так и в ситуациях, когда поток занимается какими-нибудь интенсивными действиями, съедает большую часть процессора и не дает другим потокам работать. Правда, последний подход я встречал только в программировании под Java ME, в условиях ограниченных ресурсов. Обратите внимание, что этот метод статический и действует только на текущий поток. Заставить таким образом чужой поток поделиться своим временем нельзя!

--------------------
Исследователь бытия и по совместительству Java-developer
PM MAIL WWW Skype GTalk   Вверх
Samotnik
Дата 16.10.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата

yield():

Causes the currently executing thread object to temporarily pause and allow other threads to execute.

sleep(long millis) or sleep(long millis,int nanos)

Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds.

PM MAIL   Вверх
zone51
  Дата 16.10.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Samotnik, 
intr, 

Большое спасибо я это все читал но вопрос в том оказывают ли эти два метода идентичное ВСЕГДА воздействие на потоки? Иначе говоря являются ли методы идентичными. 

Цитата

In the Hotspot implementation, the way that Thread.yield() works has changed between Java 5 and Java 6. 

In Java 5, Thread.yield() calls the Windows API call Sleep(0). This has the special effect of clearing the current thread's quantum and putting it to the end of the queue for its priority level. In other words, all runnable threads of the same priority (and those of greater priority) will get a chance to run before the yielded thread is next given CPU time. When it is eventually re-scheduled, it will come back with a full full quantum, but doesn't "carry over" any of the remaining quantum from the time of yielding. This behaviour is a little different from a non-zero sleep where the sleeping thread generally loses 1 quantum value (in effect, 1/3 of a 10 or 15ms tick). 

In Java 6, this behaviour was changed. The Hotspot VM now implements Thread.yield() using the Windows SwitchToThread() API call. This call makes the current thread give up its current timeslice, but not its entire quantum. This means that depending on the priorities of other threads, the yielding thread can be scheduled back in one interrupt period later. (See the section on thread scheduling for more information on timeslices.)


То есть насколько я понял илд обрубает поток на отрезке квантума а слип просто обрывает поток но возобновляет его с новым квантумом. Тут надо смотреть приоритеты потоков наверное. Подскажите пожалуйста. Спасибо smile  smile  smile 


--------------------
The truth is out there
PM MAIL   Вверх
Samotnik
Дата 16.10.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



может это то что вам нужно ?
Цитата

Метод         Описание                                                          Исходное состояние    Новое состояние
start()         Начинает выполнение потока                          Создание    Выполнение
stop()         Заканчивает выполнение потока                          Создание, выполнение    Завершение
sleep(long)    Пауза на некоторое число миллисекунд          Выполнение    Ожидание
sleep(long,int)    Пауза на некоторое число наносекунд                 Выполнение    Ожидание
suspend()    Приостанавливает выполнение                         Выполнение    Ожидание
resume()       Продолжает выполнение                                  Ожидание    Выполнение
yield()          Явно уступает управление                                  Выполнение    Выполнение

от сюда
вот еще от сюда материал
Цитата

Распределение времени намного более важно для программ с нитями, которые работают в цикле или тратят значительное время на математические расчеты без ввода-вывода. В этих случаях простой вызов Thread.yield() достаточен для того, чтобы дать возможность работать другим нитям с тем же приоритетом. Для разделения процессорного времени с низко-приоритетными нитями, нить может вызвать Thread.sleep(), или, более точно, wait() для объекта пока нить с низким приоритетом не даст сигнал окончания работы, вызвав notify() для объекта. 

http://www.citforum.ru/internet/javaqa/javaqanda_09.shtml
PM MAIL   Вверх
zone51
  Дата 17.10.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Samotnik, 
2All, 
Спасибо но я тут нашел отрывок из Java language spetification v3

Цитата

17.9   Sleep and Yield
 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 moni-
tors, and resumption of execution will depend on scheduling and the availability
of processors on which to execute the thread.
Neither a sleep for a period of zero time nor a yield operation need have
observable effects.

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.
 

Другими словами


Neither a sleep for a period of zero time nor a yield operation need have
observable effects.

Ни операции sleep(0) ни операции yield не нужно иметь видимых эффектов

Значит ли это что они Эквивалентны? Спасибо

Это сообщение отредактировал(а) zone51 - 18.10.2009, 00:00


--------------------
The truth is out there
PM MAIL   Вверх
dorogoyIV
Дата 18.10.2009, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(zone51 @  17.10.2009,  23:58 Найти цитируемый пост)
Значит ли это что они Эквивалентны?

да елки палки  smile 
вы внимательно читайте

Цитата(math64 @  16.10.2009,  08:56 Найти цитируемый пост)
yield - отдать управление другим потокам, без указания времени, когда управление должно вернутьс к текущему потоку.sleep - задержка на указанное время.


PM MAIL   Вверх
Старовъръ
Дата 18.10.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 4
Всего: 10



Если курица - мясо, и корова - мясо. Значит ли, что они эквивалентны? smile 
PM MAIL WWW   Вверх
zone51
Дата 18.10.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



dorogoyIV, 
Да Yield отдать управление без указания времени но везде где я читал говорится что отдается всего лишь часть кванта времени после чего поток опять получает процессор. Если бы все было так просто неужели бы на многих сайтах проводились сравенния и даж кое где писалось просто что они эквивалентны?

Добавлено через 10 минут и 23 секунды
http://www.javatalks.ru/ftopic4957.php

Цитата

sleep позволяет "уснуть" на заданный промежуток времени плюс-минус несколько квантов. yield просто уступает процессор другому потоку, но не усыпляет текущий. На большинстве ОС yield() эквивалентно sleep(0)


Однако...


--------------------
The truth is out there
PM MAIL   Вверх
dorogoyIV
Дата 18.10.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Цитата(zone51 @  18.10.2009,  12:45 Найти цитируемый пост)
и даж кое где писалось просто что они эквивалентны

не обращайте на это внимание  smile 
это две разные вещи, и не будут они эквивалентны
PM MAIL   Вверх
zone51
Дата 18.10.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



dorogoyIV, 
Ок спасибо всем, будем считать так


--------------------
The truth is out there
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.