柜台忙着等待



为了实现AsynchronousFileChannel的优雅终止,我必须等待所有提交的任务完成执行,然后再调用其close()方法。 我无法关闭并等待底层执行程序的终止,因为 Javadoc 中概述了close()方法要求。

因此,我正在尝试执行以下操作,但我不知道如何正确实现它。

线程 1, 3, 4, ...

counter.increment();
// Schedule task

线程 2(由执行程序服务管理(

// Task completed
counter.decrement();

线程 1(将来的某个时候(

while (!counter.isZero()) {
// Wait
}
// Proceed

如果可能,应接受在等待时到达的任务。后续任务应丢弃,这可能会触发一些逻辑。


Future放在BlockingQueue中是矫枉过正的,因为在这种情况下,计算排队和正在运行的任务就足够了。

我应该使用java.util.concurrent包中的哪个类?

我还没有研究你关于close()方法的断言,但你可以使用信号量来创建一种按需锁定的网关:

final Semaphore gate = new Semaphore(Integer.MAX_VALUE);
void submit() {
if (gate.tryAcquire()) {
try {
// submit
} finally {
gate.release();
}
}
}
void shutdown() throws InterruptedException {
gate.acquire(Integer.MAX_VALUE);
// shutdown
}

最新更新