Ответ 1
Добавьте спать, чтобы поместить поток в режим ожидания на некоторый интервал:
Не имея сна, цикл while будет потреблять все доступные вычислительные ресурсы. (Например, теоретически, 100% в одноядерной системе или 50% в двухъядерном ядре и т.д.)
Например, следующее цикл будет циклически повторяться через цикл while
примерно каждые 50 миллисекунд:
while (true)
{
try
{
Thread.sleep(50);
}
catch (Exception e)
{
e.printStackTrace();
}
}
Это должно сильно снизить загрузку процессора.
С сон в цикле операционная система также даст достаточно системного времени для других потоков и процессов для выполнения своих задач, поэтому система также будет реагировать. Еще в дни одноядерных систем и операционных систем с не очень хорошими планировщиками такие петли могли бы сделать систему очень невосприимчивой.
Поскольку тема использования циклов while
для игры подошла, если игра будет включать GUI, игровой цикл должен быть в отдельном потоке, иначе сам GUI перестанет отвечать.
Если программа будет консольной игрой, то потоковая передача не будет проблемой, но с графическими пользовательскими интерфейсами, которые управляются событиями, имея длинный цикл в коде, сделает GUI отвечать на запросы.
Threading и такие довольно сложные области программирования, особенно при запуске, поэтому я предлагаю, чтобы возникли вопросы, когда это становится необходимым.
Ниже приведен пример приложения Swing, основанного на JFrame
, который обновляет JLabel
, который будет содержать возвращаемое значение из System.currentTimeMillis
. Процесс обновления происходит в отдельном потоке, а кнопка "Стоп" останавливает поток обновлений.
Несколько понятий, которые иллюстрирует пример:
- Приложение GUI на основе Swing с отдельным потоком для обновления времени - это предотвратит блокировку потока GUI. (Вызывается EDT или поток отправки событий в Swing.)
- Наличие цикла
while
с условием цикла, который не являетсяtrue
, но заменен наboolean
, который будет определять, поддерживать ли цикл в рабочем состоянии. - Как
Thread.sleep
влияет на фактическое приложение.
Прошу прощения за длинный пример:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TimeUpdate
{
public void makeGUI()
{
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel l = new JLabel();
class UpdateThread implements Runnable
{
// Boolean used to keep the update loop alive.
boolean running = true;
public void run()
{
// Typically want to have a way to get out of
// a loop. Setting running to false will
// stop the loop.
while (running)
{
try
{
l.setText("Time: " +
System.currentTimeMillis());
Thread.sleep(50);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// Once the run method exits, this thread
// will terminate.
}
}
// Start a new time update thread.
final UpdateThread t = new UpdateThread();
new Thread(t).start();
final JButton b = new JButton("Stop");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
t.running = false;
}
});
// Prepare the frame.
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(l, BorderLayout.CENTER);
f.getContentPane().add(b, BorderLayout.SOUTH);
f.setLocation(100, 100);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TimeUpdate().makeGUI();
}
});
}
}
Некоторые ресурсы о потоковом использовании и использовании Swing: