java并发:标志/事件
我正在java并发类中寻找一个不可重设的标志或事件类,我可以用它来检查某件事情是否完成并且是线程安全的。理想的情况是:java并发:标志/事件,java,events,concurrency,Java,Events,Concurrency,我正在java并发类中寻找一个不可重设的标志或事件类,我可以用它来检查某件事情是否完成并且是线程安全的。理想的情况是: public interface Event { /** returns true if signal() has been called */ public boolean hasOccurred(); /** returns when signal() has been called */ public void await();
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();
}
这样的事情已经存在了吗?我的大脑在试图记忆时抽筋了我想你在寻找一个-特别是,用一个1的计数来实例化它 那么您的操作如下:
- 已发生:
闩锁.getCount()==0
- await:
latch.await()
- 信号:
锁存.倒计时()
事件
接口更容易组合成更大的操作。例如,如果要等待4个工作线程完成,可以为每个工作线程提供自己的event/1-count-lack,然后依次等待。不过,简单地创建一个计数为4的CountDownLatch,并在所有工作程序之间共享它(这一点根本不需要更改工作程序逻辑,而且不能像简单地使用多个较小的事件那样完成)。您的意思是
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();
}
}
}