我有一個隊列與多個生產者 - 一個消費者。消費者定期運行並完全排空隊列(之後沒有消息)。 一個優雅的算法應該運行消費者,並等待它超時或只是等待消費者已經運行。優雅的方式與超時消費者優雅地停止排隊
目前我們有水木清華這樣的:
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);
有誰看到更優雅的方式來做到這一點? 例如我正在尋找一種方式W/O使用額外的AtomicBoolean(isAlreadyRan)或雙等待邏輯與時間間隔作爲對象字段等 順便說一句,毒藥模式來到我的腦海裏...
您能否更清楚您的要求?應該等什麼?一個客戶端到stop()調用?它應該等待什麼,隊列流失?你是否想要一個電話stop()來阻塞,直到這個東西被排空,不管是什麼? – Toby 2011-09-06 13:36:53