Java线程在while循环中的神秘面纱

时间:2017-12-03 16:38:17

标签: java multithreading loops while-loop

我正在开发一个小小的跳跃并用Java运行游戏。我的游戏总体上基于youtube教程(https://www.youtube.com/watch?v=1gir2R7G9ws)。

我正在为玩家创建一个jump()方法。它现在很酷但是,我希望玩家以2的速度移动2个“场”。

所以我创建了一个while循环,它每次都要求高度(或y值),如果它更小或更均匀,则将速度设置为0.

但由于某种原因,我不得不在while循环的主体中询问Y值而不在额外的线程中对它做任何事情(在打印y时它被识别时)。

function moveThing(pos){
    var currentPos = pos;

    currentPos += 5;

    theThing.style.left = currentPos + "px";

    if( Math.abs(currentPos) >= 900) {
        currentPos = -500;
    }

    console.log(currentPos);
    setTimeout(function(){moveThing(currentPos)}, 100);

}

moveThing(0);

我只是想明白为什么我需要在while循环中使用额外的线程,因为它对我来说没有任何意义。我的假设是因为一些Java优化,但我不知道。谢谢你教我!

此代码段也有效。

public static void jump(GameObject pObject) {

                if (pObject.getSpeedY() == 0) {
                    int tmpY = pObject.getY();
                    pObject.setSpeedY(-2);

                    while (pObject.getY() >= tmpY - 64) {
                        new Thread(new Runnable() {         
                            public void run() {             
                               pObject.getY();              
                            }
                        }).start();
                        }
                    pObject.setSpeedY(0);
                }
}

此片段无论如何都是失败的。虽然循环是无限的,它不会改变不断变化的y值!

public static void jump(GameObject pObject) {

                if (pObject.getSpeedY() == 0) {
                    int tmpY = pObject.getY();
                    pObject.setSpeedY(-2);

                    while (pObject.getY() >= tmpY - 64) {       
                              System.out.println(pObject.getY());               

                        }
                    pObject.setSpeedY(0);
                }
}

1 个答案:

答案 0 :(得分:0)

你在那里使用的线程几乎没用。 它所做的就是获得玩家的y位置。 当你不需要它时,为什么还要费心去获取一些信息。

此外,该线程位于while循环内。这种设计会对性能造成巨大的负面影好像代码创建了1000个线程,所有这些都没有做任何事情。 CPU浪费了分配和删除线程内存的时间。

你要做的是创造一种锁。在满足某些条件之前,CPU不会执行进一步的语句。如果没有,你的代码就会被卡住。

使用线程时尤其棘手。在这种情况下,您的主线程将停止执行并可能停止更新播放器的Y位置,您将进入无限循环。

我们仅使用新线程来检查玩家位置。这样,主线程可以更新位置,新线程可以监听玩家位置。但是,我们只创建1个线程,而不是1000个线程。

new Thread(new Runnable() {         
    public void run() {
        while (pObject.getY() >= tmpY - 64) { continue; }
        pObject.setSpeedY(0)           
    }).start();