当前位置: 首页 > 面试题库 >

为什么此Java循环在线程中不起作用?

谭仰岳
2023-03-14
问题内容

我正在用Java编写电台代码,并且正在使用一个线程来当然播放流。我在线程的run方法中有一个while循环,该循环检查名为ShouldPlay的变量是否为true,以及是否运行该变量。播放器。然后,我有一个pause()方法,将变量设置为false,并且自然希望它在变量为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;


 类似资料:
  • 问题内容: 在这段代码中,为什么不按我的意愿初始化我的数组?是不是for-each循环并非旨在做到这一点,或者我只是没有正确使用它? 问题答案: for-each循环不适用于这种情况。您不能使用for-each循环来初始化数组。您的代码: 将转换为以下内容: 如果这是一个对象数组,它仍然会失败。基本上,for-each依次将集合或数组中的每个条目分配给您提供的变量,然后可以使用该变量。该变量 不

  • 问题内容: 我有以下代码: 不幸的是,当被调用时,该点并没有显示,但是我仍然得到了。我尝试单独设置一个新线程,但无济于事。我尝试了其他解决方案(和),但也无济于事。 我的目标是在屏幕上设置一个绿点。你有什么解决办法吗? 问题答案: 您正在阻止Swing事件线程使应用程序进入睡眠状态。 对于简单的动画和游戏循环,请使用Swing计时器。如果需要长时间运行的代码需要在后台运行,请使用后台线程(例如Sw

  • 如果我有时运行这些程序,它会在打印“玩家赢”或“玩家输”后继续运行,我可以找到原因。。 这里的输出: 球员滚轴3 2=5 分数是5 玩家滚轮6 4=10 游戏者滚轴6=12 玩家滚轮5 5=10 球员滚轴12=3 球员滚轴1 3=4 球员获胜 球员滚轴4 6=10 球员滚轴4 1=5 构建成功(总时间:0秒)

  • 问题内容: 在调试pycharm中的代码时,按Ctrl + C时,我的python try / except循环似乎不会触发键盘中断。我的代码如下所示: 编辑: 我的精简代码工作似乎出现了一些问题,并且没有产生相同的错误。完整的代码可以在这里查看。我还重新整理了代码(上面的代码),并产生了相同的错误。 问题答案: 从屏幕截图中可以看出,您正在IDE中运行此代码。关于IDE的问题是,它们与正常运行并

  • 我试图通过将ajax请求中的for循环的值发送到php文件来检查数据库中的值,“each value in request”,然后文件返回变量“avl”,如果不是,则不可用。 问题是,我检查了一个值流,它们都必须返回才能继续我的过程,但条件不会等到for循环结束才进行检查。它在for循环启动之前检查条件,即使代码也不是那样的。例如:在for循环在第50行结束之前,它在第100行执行条件。 它总是通

  • 问题内容: 我希望我的程序一直问这个问题,直到得到可以使用的响应为止,尤其是0到20之间的一个数字。此类中还有很多其他内容,因此这里有一段摘录,其中do- while是(我已经命名了变量以及所有内容。 问题答案: 您在表达式中使用了一个赋值: 您可以替换为 或更好 如果变量和在其他地方未使用,则可以消除它们,从而为您提供: