【问题标题】:While loop blocking other threads [duplicate]While循环阻塞其他线程[重复]
【发布时间】:2019-11-15 10:46:06
【问题描述】:

我正在等待一个布尔值随着 while 循环而改变,但 while 循环永远不会结束?我可能对此有点愚蠢

行之有效的代码。但是while循环永远不会结束,当布尔值改变时我的代码不会被执行:

while(!myCoolBoolean);
//my code when the boolean has changed to true

这有点奇怪,因为当我这样做时它会起作用:

while(!myCoolBoolean) {
    System.out.print();
}
//my code again

有什么帮助吗? 编辑:while 循环实际上是在一个线程中,而 myCoolBoolean 正在另一个线程中被更改

【问题讨论】:

  • myCoolBoolean 应该在哪里改变?请edit您的问题并添加minimal reproducible example,因为您现在发布的内容应该永远不会结束...
  • 您正在使用 while 循环阻塞整个过程。 System.out.print(); 给处理器一些时间来执行其他线程(然后显然会更新变量)。
  • 也相关 - stackoverflow.com/questions/9459657/… - 它表明虽然不能保证,但 System.out.print 的实现通常在内部同步。它可以因此导致来自其他线程的更改变得可见。

标签: java multithreading


【解决方案1】:

尝试声明:

volatile boolean myCoolBoolean;

【讨论】:

  • 谢谢,一直不知道什么是“volatile”。
  • 它基本上确保了运行while 循环的线程没有myCoolBoolean 变量的陈旧值
【解决方案2】:

我假设您正在尝试等待从另一个线程更改 myCoolBoolean 的值。如果是您的代码更新了myCoolBoolean,您应该改用wait()notify()

  1. 在某处初始化一个对象,以便两个线程都可以访问它。
    public Object myCoolObject = new Object();
    
  2. 代替你的while循环,写
    synchronized(myCoolObject) {
        myCoolObject.wait();
    }
    
  3. 在您应该更新myCoolBoolean 的地方,执行
    synchronized(myCoolObject) {
        myCoolObject.notify();
    }
    

wait(); 将暂停第一个线程,直到第二个线程调用notify();

如果您无法更改更新myCoolBoolean 的代码,您可以将循环更改为

while (!myCoolBoolean) {
    wait(1);
}

这样,您的代码将在每次迭代中暂停一毫秒,以便给其他线程时间来更新标志。如果没有wait(1);,它将耗尽你所有的处理时间,只是执行循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2017-11-15
    相关资源
    最近更新 更多