【发布时间】:2010-07-31 21:03:49
【问题描述】:
我有一个基础的异步乱序查询/响应系统,我想使其同步。可以通过使用唯一 ID 标记查询来映射查询和响应,这些 ID 反过来将伴随相应的响应。
我尝试使其同步使用两个ConcurrentHashMaps:一个从 ID 映射到结果,另一个从相同的 ID 映射到 CountDownLatches。执行查询时代码如下:
public Result execute(Query query) throws InterruptedException {
int id = atomicInteger.incrementAndGet();
CountDownLatch latch = new CountDownLatch(1);
latchMap.put(id, latch);
query.executeAsyncWithId(id); // Probably returns before result is ready
try {
latch.await(); // Blocks until result is ready
return resultMap.remove(id);
} catch (InterruptedException e) {
latchMap.remove(id); // We are not waiting anymore
throw e;
}
}
以及处理传入结果的代码:
public void handleResult(Result result) {
int id = result.getId();
CountDownLatch latch = latchMap.remove(id);
if (latch == null) {
return; // Nobody wants result
}
resultMap.put(id, result);
latch.countDown();
}
从一个线程调用此方法,该线程从底层系统读取所有传入的结果(只有一个这样的读取器线程)。
首先,我不确定线程安全性,但似乎也没有必要为此使用两个HashMaps(特别是因为 ID 从未被重用)。有什么改进的想法吗?
【问题讨论】:
-
所以删除使用“latch”的代码,但它不应该在这个函数中定义。不过,我没有看到任何可以使这个异步的东西。
-
实际执行异步查询的是底层系统。我已将该方法重命名为“executeAsyncWithId”以澄清。
-
嘿,我建议你发布自己的答案作为答案,并接受!
标签: java multithreading concurrency