Вопрос по java, thread-sleep, concurrency, multithreading – Java Thread.sleep () реализация

5

Может кто-нибудь помочь мне понять, как реализована функция Thread.sleep ()? Поток возобновляется / активируется, когда истекает указанное время или когда прерывается какой-либо другой поток. Я'Я заинтересован в понимании модели проектирования, стоящей за работой этого.

Говорят, что сон не влияет на потребление процессора. Добавлен ли текущий поток в список слушателей? Когда произойдет проверка флага прерывания? Планировщик продолжает проверять состояние прерывания каждого потока, который спит для каждого "x" количество времени (в зависимости от того, что поддерживает ОС)? Как поток возвращает управление без влияния на процессор.

Я искал это. Извините, если я пропустил любую ссылку, которую легко найти.

Это'Реализовано операционной системой, а не Java. Ваш вопрос действительно не по теме. user207421

Ваш Ответ

1   ответ
13

Может кто-нибудь помочь мне понять, как реализована функция Thread.sleep ()?

Это вызываетsleep в основном потоке, предоставленном операционной системой.

Говорят, что сон не влияет на потребление процессора.

Поток, который не запущен, не потребляет процессорного времени.

Добавлен ли текущий поток в список слушателей?

Нет.

Когда произойдет проверка флага прерывания?

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

Планировщик продолжает проверять состояние прерывания каждого потока, который спит для каждого "x" количество времени (в зависимости от того, что поддерживает ОС)?

Нет.

Как поток возвращает управление без влияния на процессор.

Поток автоматически разбудится операционной системой, когда время истечет, или другой поток может попросить операционную систему разбудить его рано.

Вот часть кода Thread.sleep () вOpenJVM:

 2811     ThreadState old_state = thread->osthread()->get_state();
 2812     thread->osthread()->set_state(SLEEPING);
 2813     if (os::sleep(thread, millis, true) == OS_INTRPT) {
 2814       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
 2815       // us while we were sleeping. We do not overwrite those.
 2816       if (!HAS_PENDING_EXCEPTION) {
 2817         HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
 2818         // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
 2819         // to properly restore the thread state.  That's likely wrong.
 2820         THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
 2821       }
 2822     }
 2823     thread->osthread()->set_state(old_state);
Большое спасибо. Это сбивает с толку большинство моих неверных толкований. У меня просто есть еще один вопрос. Когда создается InterruptedException? Есть ли функция обратного вызова, которая выполняется, когда ОС сообщает о прерывании или истечении времени? Praneeth Varma
@Praneethvarma: Когда нить просыпается, она может проверить, почему она проснулась. Я разместил код C из OpenJVM, где реализована эта проверка. Mark Byers

Похожие вопросы