Java - 应用程序在Thread.sleep方法上崩溃

时间:2015-01-08 02:02:22

标签: java multithreading crash sleep

我有一个让我的怪物走路的功能。它可以随机选择方向和距离,并在召唤时移动怪物。现在我在render方法的每一帧都调用了这个方法:

for(Monster monster : monsters) {
            renderer.processEntity(monster);
            monster.monsterWalk();
}

到目前为止这是好事,但它让怪物摇晃,因为它正在快速选择值,我希望它移动到某个地方,等待5秒,然后再决定移动的位置。

我的问题是当我添加Thread.sleep(x)方法时,屏幕变黑并且程序没有响应。

这是步行方法:

public void monsterWalk() {

    //Make direction decision
    Random random = new Random();

    switch(random.nextInt(4)) {
    case 0:
        setPosition(new Vector3f(position.x, position.y, position.z += mobSpeed)); //forward
        break;
    case 1:
        setPosition(new Vector3f(position.x, position.y, position.z -= mobSpeed)); //backward
        break;
    case 2:
        setPosition(new Vector3f(position.x += mobSpeed, position.y, position.z)); //right
        break;
    case 3:
        setPosition(new Vector3f(position.x -= mobSpeed, position.y, position.z)); //left
    }

    try {
        Thread.sleep(random.nextInt(5000) + 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }   
}

1 个答案:

答案 0 :(得分:0)

我自己没有使用过LWJGL,但在我见过的几乎所有UI框架中,都有一个为UI操作保留的线程:

  • 您不得在任何其他线程上执行UI操作
  • 你不能在任何重要时间内绑定该线程,因为UI在被阻止时无法刷新

在你的代码中,你调用Thread.sleep来阻塞该段时间的线程 - 如果你在UI线程上这样做(如果LWJGL以与其他框架相同的方式工作)那么你在阻止UI时阻止UI刷新。

要定期执行操作,您应该使用某种计时器。棘手的部分是你希望计时器在UI线程中触发 。大多数框架都为此提供了某种专用支持(例如Swing Timer),但我不知道LWJGL是否支持。希望这些信息足以让您开始在LWJGL中寻找最佳方法。

我注意到LWJGL timing documentation有点讨论这种事情,但它并非相当。 (它也指Display.sync,然后我在Javadoc中找不到它,所以它可能指的是旧版本。)