Добавить сон, чтобы перевести поток в режим ожидания на некоторый интервал:
Thread.sleep
Не имея режима сна, цикл while будет использовать все доступные вычислительные ресурсы. (Например, теоретически, 100% в одноядерной системе или 50% в двухъядерном и т. Д.)
Например, следующее будет циклически повторяться через цикл while
примерно каждые 50 миллисекунд:
while (true)
{
try
{
Thread.sleep(50);
}
catch (Exception e)
{
e.printStackTrace();
}
}
Это должно немного снизить нагрузку на процессор.
В спящем режиме операционная система также будет выделять достаточно системного времени, чтобы другие потоки и процессы могли выполнять свои задачи, поэтому система также будет реагировать. Еще во времена одноядерных систем и операционных систем с не очень хорошими планировщиками подобные циклы могли сделать систему очень безразличной.
Поскольку тема использования while
петель для игры возникла, если игра будет включать графический интерфейс, игровой цикл должен быть в отдельном потоке, иначе сам графический интерфейс станет не отвечающим.
Если программа будет консольной игрой, то многопоточность не будет проблемой, но с графическими пользовательскими интерфейсами, которые управляются событиями, наличие долгоживущего цикла в коде сделает GUI отвечать на запросы.
Потоки и другие довольно сложные области программирования, особенно когда начинаете, поэтому я предлагаю поднять другой вопрос, когда это станет необходимым.
Ниже приведен пример приложения Swing, основанного на JFrame
, который обновляет JLabel
, который будет содержать возвращаемое значение из System.currentTimeMillis
. Процесс обновления происходит в отдельном потоке, и кнопка «Стоп» остановит поток обновления.
Несколько концепций, которые иллюстрирует пример:
- Основанное на Swing приложение GUI с отдельным потоком для обновления времени - это предотвратит блокировку потока 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: