2011-03-28 7 views
4

Вот цитата из учебника я читаю в данный момент:Java тема - использование процессора

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

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

ответ

5

Вы видите это в программах, которые обновляют отображение чего-то. Это называется 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

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

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

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

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

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

+1

Эффективная Java-игра Джошуа Блоха. Пункт 72: Не зависит от потока Планировщик. Он НЕ делает это должным образом. Ответить «Нитки не должны запускаться, если они не делают полезной работы». и «Нити не должны ждать». – corsiKa

+0

Я никогда не говорил, что ты должен ждать. Существует большая разница между «циклом с множеством итераций» и оживленным оживлением. Если это конечное число итераций, мы хотим, чтобы это закончилось, если это оживленное ожидание (бесконечное число), тогда мы можем позволить ему спать –

0

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

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

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

+0

Умм, он покупает возможность использовать другие программы одновременно. Большинство потоков с циклами не нужно запускать постоянно. Они могут выиграть от перерыва. – corsiKa

+0

Я могу запускать много других программ одновременно. В Linux процессорный голодный процесс внутренне получает низкий приоритет, поэтому мне все равно. Более того, в настоящее время на большинстве компьютеров имеется несколько ядер. – maaartinus

+0

Независимо от того, что это займет целое ядро. У вас нет прямого контроля над приоритетом в приложении, и если вы делаете это через ОС, это все еще просто предложение. Это признак оживленного ожидания, и это очень серьезная проблема с производительностью. – corsiKa

0

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

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

2

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

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

+0

Вы правы. Это не упоминается. Завтра я поговорю с учителем. – nullpotent

Смежные вопросы