【问题标题】:Java Thread in while-loop mystery循环中的Java线程之谜
【发布时间】:2017-12-03 16:38:17
【问题描述】:

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

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

所以我创建了一个 while 循环,它每次都询问高度(或 y 值),如果它更小甚至更小,那么它将速度设置为 0。

但由于某种原因,我不得不在 while 循环的主体中询问 Y 值,而无需在额外的线程中对其进行任何处理(认识到它在打印 y 时工作时)。

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);
                }
}

我只是想了解为什么我需要在 while 循环中使用那个额外的线程,因为这对我来说毫无意义。我的假设是因为一些 Java 优化,但我不知道。谢谢你教我!

这个 sn-p 也可以。

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);
                }
}

这个sn-p,但是失败了。虽然循环是无限的,但它不会改变不断变化的 y 值!

public static void jump(GameObject pObject) {

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

                    while (pObject.getY() >= tmpY - 64) {                   
                               pObject.getY();              
                        }
                    pObject.setSpeedY(0);
                }
}

【问题讨论】:

  • 你实际上不需要它。此外,像您一样在 while 循环中启动线程是一个糟糕的主意。您想要完成什么,以及您的第一种方法没有实现什么?
  • while 循环之前是无限的,并且从未结束。然后我尝试在 while 循环中打印 y 值,然后它就可以工作了。我搜索了 println() 方法,发现它正在使用带有线程的东西,所以我尝试了这个。我不是 Java 专家
  • pObject.getY()在重复调用时如何改变返回值?它是在不同的线程中更改的吗?如果是这样,我认为你应该重新考虑你的设计。
  • 我没有看到 tmpY 被更改,所以这必须发生在不同的线程中。也许最后一个代码与前两个代码之间的区别在于,执行 IO 操作或创建新线程可能会产生当前线程,从而为不同的线程提供更改 tmpY 值的机会,这在最后一个场景中不太可能发生都是计算。
  • 这个问题不够清楚,我无法弄清楚发生了什么。请张贴发生的事情与您期望发生的事情。以及何时以及如何创建和操作 pObject。以及它是否发生在其他线程等中。

标签: java multithreading loops while-loop


【解决方案1】:

您在那里使用的线程几乎没用。 它所做的只是获取玩家的 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多