【问题标题】:if statement not called unless condition is printed before [duplicate]除非在 [重复] 之前打印条件,否则不会调用 if 语句
【发布时间】:2016-02-24 21:17:58
【问题描述】:

好吧,这有点奇怪。基本上我正在创建一个播放列表,因此我的游戏中的背景音乐将在上一首歌曲完成后播放,等等。如果我删除System.out.println(music.isPlaying());,那么 if 语句中的代码块永远不会被调用,即使music.isPlaying()实际上是 false 。但是,如果我在它之前添加 print 语句,那么它会神奇地正常工作。但这仅适用于 print 语句,我不能只将布尔值发送到某个空方法或为其设置一个布尔变量,它仅在发送到控制台时才有效。但是,出于显而易见的原因,我不希望将垃圾邮件发送到控制台是真值。有谁知道为什么会出现这种情况以及我该如何解决?

    while (true) {
        System.out.println(music.isPlaying()); // Only works with this here
        if (!music.isPlaying()) {
            System.out.println("Changing song");
            currentSongIndex++;
            if (currentSongIndex >= musicFiles.size())
                currentSongIndex = 0;
            music = musicFiles.get(currentSongIndex);
            music.play();
        }
    }

我不确定这是否对此有任何影响,但这个循环是在第二个线程上调用的,因为我的游戏是在它自己的线程上运行的。如果出于任何原因这可能是原因,请告诉我,我可以发布我的多线程代码。

【问题讨论】:

  • 如果这是一个多线程问题,你应该分享线程代码。
  • “if 语句中的代码块永远不会被调用”是什么让你认为是这种情况?
  • 如果您将Music 类中的isPlaying 变量(我假设有这样一个变量)更改为volatile,在没有System.out 的情况下它会工作吗?
  • 鉴于它被编码为无限循环,难道不应该在这个线程上稍作休眠以腾出一些时间来进行其他执行吗?当您出于同样的原因放入 print 语句时,它可能会起作用,有效地暂停当前线程的执行。
  • @MickMnemonic 好吧,我不完全确定这是否是一个多线程问题,似乎让我玩布尔型 volatile 解决了这个问题,尽管我仍然发布了多线程代码,但它已经解决了?

标签: java multithreading if-statement while-loop background-music


【解决方案1】:

您需要像这样将Music.isPlaying() 使用的布尔变量声明为volatile

volatile boolean playing;

您可以阅读更多关于volatile 关键字在Javamex 上的作用。

【讨论】:

  • 谢谢!这使它起作用了,尽管我不确定为什么添加该打印也使它起作用,但我很高兴摆脱它
  • 这是因为System.out.println() 方法是同步的,这意味着类似于:它必须在所有线程中更新变量才能工作。
【解决方案2】:

首先,请发布您的线程代码。

此外,您可以为正在打印的值保存一个布尔值,以便为将来的函数调用保留它。您可以在您的打印语句中执行此操作(我知道您说过您无法保存它。

确保您的方法是“同步的”,这样它们就不会竞争相同的资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2018-12-21
    • 2021-07-13
    相关资源
    最近更新 更多