我正在寻找java并发类中的一个不可重置的标志或事件类,我可以用它来检查某些事情是否完成并且是线程安全的。理想情况如下:
public interface Event
{
/** returns true if signal() has been called */
public boolean hasOccurred();
/** returns when signal() has been called */
public void await();
public void signal();
}
这样的事情是否存在?我想要记住脑痉挛
答案 0 :(得分:14)
我认为你正在寻找CountDownLatch - 尤其是以1为实例进行实例化。
然后您的操作如下:
latch.getCount() == 0
latch.await()
latch.countDown()
如果您想要重复使用某些内容并重复使用,那么CyclicBarrier可能会更符合您的要求。 CountDownLatches一旦被触发,就无法重置。
编辑:值得注意的是,与您提到的Event
界面相比,CountDownLatch更容易组合到更大的操作。因此,例如,如果您要等待4个工作线程完成,那么<em>可以为每个工作人员提供自己的事件/ 1计数锁存器并依次等待每个工作线程。但是,简单地创建一个计数为4的CountDownLatch,并在所有工作者之间共享这一点(可能根本不需要更改工作逻辑,而且不能简单地使用多个较小的事件) )。
答案 1 :(得分:1)
您的意思是Condition吗?
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}