Не вызывают ли потоки с бесконечными циклами чрезмерной загрузки ЦП - PullRequest
0 голосов
/ 17 июня 2020

Так что это может оказаться неприятным вопросом, но с Java могут ли бесконечные циклы в Threads вызывать чрезмерную загрузку ЦП? Я не очень разбираюсь в многопоточности в Java, но я предполагал, что Java выделяет одинаковое время для всех потоков, независимо от того, что потоку нужно делать или нет. Итак, я неявно предполагал, что бесконечные циклы в многопоточной среде не будут снижать производительность, как это было бы в однопоточной среде. В результате у меня есть много кода, который выглядит как приведенный ниже фрагмент:

public Thread readerThread = new Thread() {
  @Override
  public void run() {
    while(true) {
      readNextMessage(); // Does nothing if there are no messages to read
    }
  }
}
readerThread.start();

Недавно я начал замечать серьезные проблемы с производительностью в моем приложении, и я начинаю задаваться вопросом, может ли мой подход к потоковой передаче это причина.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

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

Представьте, если ваше предположение было правильным, и сервер имеет 100 потоков, по одному для каждого клиента. А теперь представьте, что большинство этих клиентов неактивны. Это означало бы, что каждый активный клиент может получить максимум 1/100 ЦП. Это было бы довольно ужасно.

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

0 голосов
/ 17 июня 2020

Если вы можете гарантировать, что в системе всегда будет больше процессоров, доступных для выполнения потоков, чем количество потоков, готовых к запуску, то такое «занято l oop» не проблема. * Но, когда другим потокам приходится ждать своей «справедливой доли» процессорного времени, бесполезно иметь поток, который тратит свою долю процессорного времени, постоянно проверяя, есть ли какая-нибудь работа, которую нужно выполнить, и постоянно не нахожу ничего.

я предполагал, что Java выделяет равное время для всех потоков.

Это недоразумение. Система попытается выделить «справедливую долю» процессорного времени каждому потоку , который этого хочет. Если потоку не нужно процессорное время, потому что он заблокирован в ожидании ввода-вывода, заблокирован в o.wait() call, заблокированный в вызове Thread.sleep(...), et c., затем этот поток прекращает работу, и его «справедливая доля» выделяется другим потокам, пока он не «проснется» и снова не будет готов к работе.


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

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