gpt4 book ai didi

java - Java 中的线程使用 100% 的 CPU

转载 作者:行者123 更新时间:2023-11-30 06:50:28 24 4
gpt4 key购买 nike

我正在使用 Eclipse 用 Ja​​va 编写。

在我的项目(一个简单的 RPG 游戏)中,我有一个游戏主线程。有一个游戏循环、滴答和渲染等。在 Game 对象中,我保留了 GameState 对象。

public class Game implements Runnable{

public State gameState;
public State menuState; // I keep one open by State.setState(gameState)

private void tick(){
keyManager.tick();

getInput();

if(State.getState() != null)
State.getState().tick();
}
}

在其中,有一个 World 对象。

public class GameState extends State{

private World world;

public void tick() {
world.tick();
}
}

然后,我有一个包含 map 上每个实体的数组。

public class World {

private EntityManager entityManager;

public World(/*some args*/){

for (int i=0; i<3; i++){
addRandomNPC();

// ^ it does some stuff, but in the end, it uses:
// entityManager.addEntity(new NPC(/*random args*/));
}

}

public void tick(){
entityManager.tick();
}

}

public class EntityManager{

private ArrayList<Entity> entities;

public void tick(){
for(int i = 0;i < entities.size();i++){
Entity e = entities.get(i);
e.tick();
}
entities.sort(renderSorter);
}
}

我添加了一个 NPC。我希望它自己移动(在随机时间段内以随机方向随机移动),所以我在它们内部创建了一个线程。更具体地说,我有一个实现 Runnable 的 AutoMover 类。

public class NPC extends Creature {

private Automover autoMover;

public void tick(){
randomizeInput();
move();
}

private randomizeInput() {
xMove = autoMover.getxMove();
yMove = autoMover.getyMove();
}
}

public class AutoMover implements Runnable {

private Timer timer

public void run() {
timer = new Timer();
Random gen = new Random();
duration = gen.nextFloat()*Utils.maxAutoMoverDuration;

while(running){
timer.update();


if(timer.timer >= duration*1000000000){

// some simple math about xMove, yMove and duration

duration = gen.nextFloat()*Utils.maxAutoMoverDuration;
timer.timer = 0;
}
}

stop(); // does some extra stuff when closing the thread

}

所以...我尝试添加 1 个 NPC。工作了。 2 - 工作。 10 - 该死的!就好像我的 CPU 开始对我大喊大叫。难不成,这10个NPC的所有线程都占用了这么多CPU?什么是更好的方法呢?我想让它真正随机和独立。

最佳答案

100% 通常表示您没有“hibernate ”您的线程。我也没有在您的代码中发现任何迹象。

所以,那就是:可以预期。答案很简单:不要让您的线程处于“热”循环;除了检查循环条件什么都不做。你看,现代 CPU 每秒可以执行此操作(检查循环条件)很多 次。它发现这太无聊了,以至于变得愤怒,也就是对此很热。

一个简单的 Thread.sleep(50),或 100,或 xxx 应该在这里做!

关于java - Java 中的线程使用 100% 的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41345835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com