如何停止Java while循环消耗超过50%的CPU?

好的,我在一个空程序上进行了测试,仅运行一会儿(true){}就使我的CPU占用了50%以上的资源。我正在开发一个游戏,它使用while循环" title="while循环">while循环作为主循环,并且CPU始终处于100。

我如何才能让Java重复执行某些操作,而又不消耗超过50%的CPU来执行重复操作呢?

回答:

添加睡眠以使线程在一段时间内处于空闲状态:

Thread.sleep

没有睡眠,while循环将消耗所有可用的计算资源。(例如,理论上,单核系统为100%,双核系统为50%,依此类推。)

例如,以下代码将while大约每50毫秒循环一次:

while (true)

{

try

{

Thread.sleep(50);

}

catch (Exception e)

{

e.printStackTrace();

}

}

这将大大降低CPU利用率。

有了一个休眠循环,操作系统还将为其他线程和进程提供足够的系统时间来执行其任务,因此系统也将做出响应。在单核系统和具有不太好的调度程序的操作系统的时代,像这样的循环可能会使系统反应迟钝。


由于出现了while针对游戏使用循环的主题,因此,如果游戏要包含GUI,则游戏循环必须位于单独的线程中,否则GUI本身将无响应。

如果该程序将是一个基于控制台的游戏,那么线程就不会成为问题,而是使用事件驱动的图形用户界面,如果代码中存在长时间循环,将使GUI无响应。

线程等是编程中非常棘手的领域,尤其是在入门时,因此我建议在必要时提出另一个问题。

以下是基于的Swing应用程序的示例,该应用程序JFrame更新JLabel,其中将包含的返回值System.currentTimeMillis。更新过程在单独的线程中进行,并且“停止”按钮将停止更新线程。

该示例将说明一些概念:

  • 一个基于Swing的GUI应用程序,具有单独的线程来更新时间-这将防止GUI线程被锁定。(在Ewing中称为EDT或事件调度线程。)
  • 使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的一些资源:

  • 线程和摆动
  • 课程:并发

以上是 如何停止Java while循环消耗超过50%的CPU? 的全部内容, 来源链接: utcz.com/qa/422200.html

回到顶部