Java:清空循环

Abr*_*itu 7 java multithreading

我正在使用以这种方式执行的while循环创建一个程序:

  1. 主线程进入while循环.
  2. while循环中没有任何反应.
  3. 线程将保持while循环,直到满足条件.
  4. 另一个线程运行一个满足所述条件的函数.

这是一个例子:

while(path != null);
Run Code Online (Sandbox Code Playgroud)

类中还有另一个函数将路径设置为null,一旦发生这种情况,主线程就应该退出这个循环.另一个函数在另一个线程中调用.

但是,即使path设置为null,主线程也不会退出循环.有什么建议?

码:

try 
 { 
  for (Node n:realpath) 
    { 
      Thread.sleep(100); 
      actor.walk(n); 
     }
    Thread.sleep(100); 
 } 
 catch (InterruptedException ex) 
  { 
    Logger.getLogger(VNScreen.class.getName()).log(Level.SEVERE, null, ex); 
  } 
  realpath.clear(); 
  path = null;

if(path == null)
    System.out.println("NULLED PATH");
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 13

忙碌的等待是非常昂贵的.我这样做:

Object LOCK = new Object(); // just something to lock on

synchronized (LOCK) {
    while (path != null) {
        try { LOCK.wait(); }
        catch (InterruptedException e) {
            // treat interrupt as exit request
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您设置path为null时,只需调用

synchronized (LOCK) {
    LOCK.notifyAll();
}
Run Code Online (Sandbox Code Playgroud)

(this如果两段代码都在同一个对象中,您可以同步.)


ass*_*ias 6

您可以使用CountDownLatch,而不是使用低级别的等待/通知方法,并且避免使用 volatile 忙于等待。因为只有一个事件可以预期,所以将闩锁实例化为:

CountDownLatch latch = new CountDownLatch(1);
Run Code Online (Sandbox Code Playgroud)

替换while (path != null)为:

latch.await();
Run Code Online (Sandbox Code Playgroud)

在您的主代码中,只需执行以下操作:

path = somePath;
latch.countDown();
Run Code Online (Sandbox Code Playgroud)