为了实现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
}