Java多线程 - 等待条件并释放所有线程

时间:2013-12-17 13:45:27

标签: java multithreading

我有一个相对简单的问题要解决,即我想让所有线程等待某个条件发生然后继续。它可以通过以下代码解释:

void doSth(){ //shared by multiple threads
...
if(!conditionMet())
    await();

//procceed further
resetCondition()
}

我不想使用锁定和条件,因为它似乎没必要。 CountDownLatch是完美的,但我必须重置锁存器,CyclicBarrier也不会工作,因为我不知道有多少线程需要调用等待。此外,当信号被发送到等待线程时,它们都应该被释放并继续。你们怎么会接近这个?

3 个答案:

答案 0 :(得分:2)

我建议Phaser

  

我不知道有多少线程需要调用等待。

对于最终需要等待的每个线程,调用phaser.register() [寄存器不等待,它告诉移相器期望另一个线程等待或跳过障碍物]

  

CountDownLatch会很完美,但我必须重置锁存器

线程完成后,调用phaser.arriveAndAwaitAdvance()。此时,所有线程将在那里等待number of threads registered == number of threads arrived

答案 1 :(得分:1)

  

我不想使用锁定和条件,因为它似乎没必要。

为什么呢?这对我来说过早优化了。如果您不知道有多少个线程,则无法使用CountDownLatch。在我看来,这是标准锁和条件的完美用例。我们唯一一次担心它们的使用是我们努力不让线程阻塞。但在这种情况下,阻塞正是你想要的。

答案 2 :(得分:0)

我真的不明白为什么你不想使用锁?任何“屏障”机制都会在内部使用某种形式的同步,因此没有真正“同时释放所有线程”的解决方案。

我能想到的最好:

private final Object lock = new Object();

void doSth() { //shared by multiple threads
    ...
    synchronized(lock) {
        while(!conditionMet()) {
            lock.wait();
        }
    }
}

void release() {
    synchronized(lock) {
        resetCondition();
        lock.notifyAll();
    }
}