Как будет вести себя Thread.sleep, если во время «сна» произойдет полный G C? - PullRequest
2 голосов
/ 04 февраля 2020

Я понимаю, что время сна не является точным или настолько точным, насколько это может сделать ОС.

При условии отсутствия других экстремальных факторов ..

Мой вопрос: что, если поток начинает спать, скажем, 10 секунд, затем G C срабатывает через 5 секунд (в середине времени ожидания потока) и продолжается в течение 10 секунд, закончится ли поток сразу, или он будет спать еще 5 секунд ( всего 20 секунд)?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Это зависит от нескольких факторов, но в общем случае ответ должен быть 15, дай или возьми (больше дай или возьми). Это зависит от того, где находится опрос безопасных точек при выполнении sleep. На мой взгляд, поток находится в уже в безопасной точке, когда он выполняет sleep (и я не вижу причин делать это иначе + кажется, что у Мааартинуса такая же мысль). Вы можете прочитать здесь , почему это важно.

Таким образом, ваша нить спала в течение 5 seconds, GC включается и останавливает мир (AFAIK поток G C "защищает" страницу и, как таковое, "ошибка защиты памяти") "происходит, и именно так виртуальная машина проводит опрос безопасных точек), поэтому все приложение останавливается на 10 seconds, но время настенных часов все еще прогрессирует. Таким образом, нет смысла спать 5 больше секунд; легко определить, что нить уже достаточно выспалась.

2 голосов
/ 04 февраля 2020

Мой вопрос заключается в том, что если поток начинает спать, скажем, 10 секунд, то G C попадает через 5 секунд (в середине времени ожидания потока) и продолжается в течение 10 секунд, будет ли поток закончить спать сразу или он будет спать больше 5 секунд (всего 20 секунд)?

Полагаю, вы спрашиваете об остановке мира G C, которая не единственная или самый распространенный вид. Все не-G C потоки не могут работать во время такого G C, но sleep() время не (прямо) не принимает это во внимание.

Вы можете думать о sleep() как о вызывающий поток не может запускаться до определенного c будущего времени. Как правило, он возобновляется очень скоро после того, как наступит это время, но если что-то еще, такое как запущенный тогда G C, мешает ему сделать это, его возобновление будет отложено до тех пор, пока эта ситуация не будет разрешена. Иными словами, время G C может перекрывать время сна, но эти два фактора являются отдельными и независимыми факторами, которые каждый (временно) препятствует продвижению потока.

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