等待并通知协调

时间:2012-07-18 05:36:40

标签: java multithreading

有一个主线程有一个while循环,在此期间他检查某些条件,如果满足所有条件,他启动另一个线程进入wait()状态。

并行运行的其他线程在工作完成时通知主线程。

"子线程"存在问题通知主线程之前主线程进入等待状态=死锁。

避免它的最佳做法是什么?

5 个答案:

答案 0 :(得分:1)

确保主线程不会等待已发生的事情。 (为什么有人会这样做呢?没有意义。)

答案 1 :(得分:0)

我更愿意使用Explicit Locks。请参阅Java Concurrent Api。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html

答案 2 :(得分:0)

使用信号量进行通知。

就是这样,真的。信号量有一个计数,可以记录通知,直到主线程到处等待它。

答案 3 :(得分:0)

简单的答案是使用Java 5中的并发包。这里的CountDownLatch似乎很合适。

如果您仅限于Java 5之前的环境,则必须创建使用相同算法的自定义实现。主线程将在创建所有子线程后调用signalReady。子线程在完成工作后会调用signalComplete。

一个简单的实现方法是让一个名为Latch的Object有两个两个成员字段。

  

以下实施适用于一个父母和一个孩子。对于额外的孩子,每个孩子都可以获得自己的闩锁,以便在完成时发出信号仍然会出现这种情况。在信令之间添加自旋锁或者睡眠可以减少竞争条件的可能性。 它不会消除它

class Latch{
  Object readyLock;
  Object completeLock;

  public void signalComplete(){
    synchronized(readyLock){
      readyLock.wait()
    }
    //spin lock as a precaution
    synchronized(completeLock){
      completeLock.notify()
    }
  }

  public void signalReady(){
    synchronized(readyLock){
      readyLock.notify()
    }
    synchronized(completeLock){
      completeLock.wait()
    }
  }
}

希望这有帮助!

答案 4 :(得分:0)

几乎总是wait()方法放在while循环中,其“迭代条件”是检查特定事件是否已发生,这是一种非常常见的做法,发生时,另一个线程会调用notify()方法。

前:

while(!event_occurrence) {
    ...
    wait();
    ...
}

其中event_occurrence是另一个线程调用notify()方法的事件。