java - 除非之前打印了条件,否则不会调用 if 语句

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

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

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

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

最佳答案

您需要声明 Music.isPlaying() 用作 volatile 的 boolean 变量,如下所示:

volatile boolean playing;

您可以在 Javamex 上详细了解 volatile 关键字的作用。 .

关于java - 除非之前打印了条件,否则不会调用 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35613317/

相关文章:

python - zmq python 与 multiprocessing.Process 崩溃,但不与 threading.Thread 崩溃

c - 线程工作不正常

java - 子线程名称未在run()中打印

swift - 无法在 if 语句中设置查询?

variables - 如何检查目录名称中是否存在带有通配符的目录?

java - 使用 CellRenderer 来自 jTable 的颜色特定单元格

java - 基本 dagger java 示例 NPE

Java opengl 立方体渲染

java - Android/Java - 将双倍价格转换为字符串,并给出货币参数

c - 数组中的邻居