Потоки Java - использование процессора - PullRequest
5 голосов
/ 29 марта 2011

Вот цитата из учебника, который я сейчас читаю:

"То есть, когда поток должен выполнить цикл с большим количеством итерации, это хорошая практика, чтобы поставить сон () в каждой итерации - Короткое время ожидания события, например, 5 миллисекунд, может уменьшить общее Загрузка процессора приложения из 100% до> 1% "

Это хорошая практика, я верю, но; не планировщик делает именно это - немного времени для thread1 ; приостановить поток1 ; Немного времени на thread2 ... и т. Д. Я не могу понять такой уровень выпадения, кто-нибудь желает просветить меня?

Ответы [ 5 ]

5 голосов
/ 29 марта 2011

Вы часто видите это в программах, которые обновляют отображение чего-либо. Это называется Busy Waiting, и это плохо.

Если у вас есть цикл, который делает что-то вроде этого

public void run() {
    while(running) {
        gui.render();
    }
}

Вы собираетесь жевать ваш процессор, когда вам это действительно не нужно. Вам нужно рендерить, снова и снова, более 100000 раз в секунду? Нет, вам действительно нужно всего около 30 кадров в секунду.

public void run() {
    while(running) {
        gui.render();
        try { Thread.sleep(10); } catch(InterruptedException e) { /* we tried */}
    }
}

Это ограничит вас скоростью до 100 кадров в секунду, и вы получите гораздо лучшую производительность.

Вы не всегда хотите это для процессорных фоновых потоков, так как вы хотите, чтобы они имели приоритет. При этом, если ваш фон занимает все ресурсы ЦП, как вы будете обрабатывать дальнейший ввод (например, я не знаю, кнопку ОТМЕНА, потому что вы не хотели начинать такой интенсивный, продолжительный час вычислений?)

Поэтому добавление небольшого сна в ваши потоки МОЖЕТ быть очень хорошим решением.

2 голосов
/ 29 марта 2011

Когда ваша программа выполняет обработку чисел (или другие задачи с интенсивным использованием процессора), вы хотите, чтобы она работала на 100%, не так ли?

OTOH, если ваша программа ожидает ввода, то вам следуетмаксимально используйте асинхронное программирование и не выполняйте его бесконечно в цикле (asynchronous = system вызывает вас).

2 голосов
/ 29 марта 2011

Планировщик делает именно это.
Разница в том, что планировщик делает это правильно. Это означает, что он будет эффективно использовать процессор, и поэтому вы получите хорошее использование процессора.

Я не вижу в этом ничего плохого. Это просто значит, что работает.

Когда вы дадите ему спать, будет больше времени простоя, и вы уменьшите нагрузку на процессор. Если по какой-то причине это ваша цель.
Высокая загрузка ЦП не является вредной (если только у вас не перегреется, и в этом случае у вас возникнут проблемы с оборудованием).

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

Если вы используете 1% ЦП, это означает, что он не работает, так почему у вас такой хороший компьютер? Вы должны воспользоваться оборудованием.

0 голосов
/ 29 марта 2011

Я никогда не слышал о такой практике, однако это, вероятно, привело бы к огромному снижению загрузки ЦП. Это связано с тем, что «биты» времени, выделяемые планировщиком для каждого потока, очень малы, поэтому 5 мс - это значительное количество времени по сравнению с этим.

С учетом вышесказанного я вижу одно место, в котором вы могли бы выиграть от такого замедления потока: отзывчивость на одноядерных машинах.

0 голосов
/ 29 марта 2011

Забудь об этом.Что ограничивает использование процессора до 1%? Ничего вообще?

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

Вы можете захотеть, если естьдругие более важные потоки или, если вы захотите остановить этот поток, используя Thread.interrupt(), но в обоих случаях это может быть достигнуто иначе.

...