【问题标题】:How to get infinite loop in java to work?如何让java中的无限循环工作?
【发布时间】:2017-05-12 04:30:53
【问题描述】:

这是我的java代码。

        CameraFrame cf = new CameraFrame();
        while (true) {
            // System.out.println("hello");
            if(cf.cp.play) {
                AppGameContainer app = new AppGameContainer(new Game("Snake"));
                app.setDisplayMode(WIDTH, HEIGHT, false);
                app.setTargetFrameRate(FPS);
                app.setShowFPS(false);
                app.start();
            }
        }

由于某种原因,这永远不会在 java 中运行。我确实在某处读到过诸如 Java 和 C# 之类的编程语言通过不执行此类循环来优化代码(据说这些循环没有用处)。但是我有来自(slick2d 游戏库)的代码,它从未在这里运行。但是,如果我输入 System.out.println 声明,一切都很好。

所以我的问题是,如何在不使用 System.out.println 行的情况下诱导这个 while 循环运行。

注意:我完全理解无限循环是不好的,但在游戏或服务器中可能存在无限循环可能是唯一最好的方法。

编辑:

我已经更新了代码。 CameraFrame 基本上是另一个线程,它打开视频并将其显示在 JFrame 上,cf.cp 是 JPanel,cf.cp.play 是布尔值,由 CameraFrame 上的 JButton 触发。所以我有一个 JFrame,它有一个 JButton,应该能够从 slick2d 触发这个新窗口。

【问题讨论】:

  • 你可以在 Java 中做到这一点。我认为您可能有其他代码阻止它执行。愿意分享更多内容吗?
  • 是什么让您认为它没有运行?
  • 你的循环什么也不做,因为cf.cp.play 是假的。如果你想让你的线程看到它的变化,它必须是volatile
  • 我们不需要测试它;很明显。循环不会随机执行失败。
  • 带有无限循环的简单 main 不会终止。正如@shmosel 建议的那样,除非是volatile,否则您的cpu 密集型循环不会看到cf.cp.play 的值发生变化。

标签: java optimization while-loop infinite-loop


【解决方案1】:

因此,如果我理解正确,您正在等待其他线程使 cf.cp.play 变为真。在不独占处理器的情况下执行此操作的经典方法是让线程进入睡眠状态,除非您可以控制更改完成的方式(另一个线程),在这种情况下,您最好在某些情况下执行通知cf.cp.play 的值变为 true。

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多