【发布时间】: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