【发布时间】:2011-08-12 04:30:36
【问题描述】:
我有一个包含多个生产者的队列 - 一个消费者。消费者定期运行并完全排空队列(之后不留下任何消息)。 一个优雅的算法应该运行消费者并在超时时等待它,或者如果消费者已经在运行,则只是等待。
目前我们有这样的:
void stop(boolean graceful) {
if (graceful && !checkAndStopDirectly()) {
executor.shutdown();
try {
if (!executor.awaitTermination(shutdownWaitInterval, shutdownWaitIntervalUnit)) {
log.warn("...");
}
} catch (InterruptedException e) {
log.error("...", e);
}
} else {
executor.shutdownNow();
}
private boolean checkAndStopDirectly() {
ExecutorService shutdownExecutor = Executors.newSingleThreadExecutor();
try {
return shutdownExecutor.submit(new Callable<Boolean>(){
@Override
public Boolean call() throws Exception {
if (isAlreadyRan.compareAndSet(false, true)) {
try {
runnableDrainTask.run();
} finally {
isAlreadyRan.set(false);
}
return true;
} else {
return false;
}
}
}).get(shutdownWaitInterval, shutdownWaitIntervalUnit);
有没有人看到更优雅的方式来做到这一点? 例如我正在寻找一种不使用附加 AtomicBoolean (isAlreadyRan) 或具有时间间隔的双重等待逻辑作为对象字段等的方法。 顺便说一句,我想到了毒丸图案……
【问题讨论】:
-
你的要求能再清楚一点吗?应该等待什么? stop() 调用的客户?它应该等待什么,队列耗尽?无论如何,您是否希望调用 stop() 来阻止直到东西被耗尽?
标签: java multithreading concurrency message-queue