我正在用 Java 编写一个 radio ,当然我正在使用一个线程来播放流。我在线程的运行方法中有一个 while 循环,它检查一个名为 shouldPlay 的变量是否为真,如果它是它运行播放器。然后,我有一个将变量设置为 false 的 pause() 方法,自然我希望它在变量为 false 时不运行播放器。我在下面创建了一个小例子来说明我是如何设置它的:
class audiostream extends Thread {
private boolean shouldPlay = true;
@Override
public void run() {
while(true)
{
if(shouldPlay)
{
shouldPlay = false;
System.out.print("test");
}
}
}
public void pause() {
shouldPlay = false;
}
public void play() {
shouldPlay = true;
}
}
我想要发生的是当线程第一次运行时,它应该打印“test”(它确实很好)。然后,当您运行 pause() 时,它应该将 shouldPlay 设置为 false 并且不允许打印出“test”。但是当你调用 play() 时,它应该将 shouldPlay 设置为 true 然后再次打印出测试。问题是它没有这样做。
虽然只有大约 1/100 的时间。我是否正确地假设这里的问题是即使我从另一个线程调用 play() 和 pause() 不是为了“挂起”父线程,我的子线程卡在那个 while 循环上并且在调用 play() 或来自父级的 pause() 变量不会因为那个循环而改变值?如果真是这样,我不知道该怎么办!
最佳答案
添加 'volatile' 将修复它
private volatile boolean shouldPlay = true;
关于java - 为什么线程中的这个 Java 循环不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369742/