Если вы можете гарантировать, что в системе всегда будет больше процессоров, доступных для выполнения потоков, чем количество потоков, готовых к запуску, то такое «занято l oop» не проблема. * Но, когда другим потокам приходится ждать своей «справедливой доли» процессорного времени, бесполезно иметь поток, который тратит свою долю процессорного времени, постоянно проверяя, есть ли какая-нибудь работа, которую нужно выполнить, и постоянно не нахожу ничего.
я предполагал, что Java выделяет равное время для всех потоков.
Это недоразумение. Система попытается выделить «справедливую долю» процессорного времени каждому потоку , который этого хочет. Если потоку не нужно процессорное время, потому что он заблокирован в ожидании ввода-вывода, заблокирован в o.wait()
call, заблокированный в вызове Thread.sleep(...)
, et c., затем этот поток прекращает работу, и его «справедливая доля» выделяется другим потокам, пока он не «проснется» и снова не будет готов к работе.
* Если игнорировать энергопотребление. ЦП, выполняющий инструкции (даже инструкции, которые не делают ничего полезного), потребляет больше электроэнергии, чем ЦП, находящийся в состоянии «ожидания прерывания». При таком l oop система будет потреблять больше электроэнергии. Это может превысить бюджет мощности для небольшой встроенной системы или может привести к существенному замедлению работы персонального компьютера, чтобы предотвратить перегрев. [Управление температурой ПК, особенно ноутбуков и мобильных устройств, построено на предположении, что процессоры будут использоваться только короткими импульсами.]