java - 为什么线程中的这个 Java 循环不起作用?

标签 java multithreading loops

我正在用 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/

相关文章:

java - 如何在 Hibernate 中创建/调用 sql View

java - 使用swing在java中计算和打印时间

java - 检查数组成员是否为素数时出错

c++ - LoadTree 如何在 root 中工作?

java - 使用 Intellij IDEA 将 Maven 依赖项添加到 XML

java - Android - 从 UI 线程切换回来?

java - <t :selectOneRadio link to backbean problem

java - 我的搜索过程通过多线程变得更慢

c# - 缓存 Process.Threads 而不是实时值

java - 如何将每个循环的 Java 减半?