2013-12-18 49 views
0

我试图找出一个解决以下问题后复位条件:Java并发保留方法

public void signal(){ 
    //resets condition and signals threads blocked below 
} 

public void getValue(){ 

    waitOnCondition(); //block if a condition is not met. When signalled, all threads should proceed and get the value 

    //get value 

    resetCondition(); //reset condition, so that the next thread that executes this method blocks on the method above 

} 

我现在面临这个问题似乎很简单,但我很努力,看看如何将所有的边缘情况可以被捕获。

一种解决办法可能是使用Lock s的Condition s,则所有的线程witing上waitOnCondition直到标志被设置为true要await,然后进行,例如。然后执行signal()的线程将使用相同的锁,将该标志设置为true并将其设为signal。然后,释放的线程将重新获取锁以将条件设​​置为false。但是,这并不能保证所有线程都将达到getValue点。例如:

线程1和2正在等待,获取信号。信号发出后,线程1重新获得锁定,检查条件,现在为真,然后继续。获取该值,获取锁并将条件设置为false。线程2现在看到的情况仍然是错误的,并再次阻止。

另一种解决方案,非常整洁优雅,将使用CountDownLatch。这保证了所有的线程都将继续。但是,这是不可重置的。任何其他想法或意见?

+0

http://stackoverflow.com/questions/20635844/java-multithreading-awaiting-condition-and-releasing-all-threads – assylias

回答

2

似乎是CyclicBarrier是你需要的。这是可重置的,也可以在所有各方都在场时触发屏障行动。

还有Phaser这是CyclicBarrier的高级版本,它需要运行JDK 7。