gpt4 book ai didi

java - 使异步查询同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:22 25 4
gpt4 key购买 nike

我有一个底层异步乱序查询/响应系统,我想使其同步。可以通过使用唯一 ID 标记查询来映射查询和响应,这些 ID 将伴随相应的响应。

我试图让它同步使用两个 ConcurrentHashMap s:一个从 ID 映射到结果,一个从相同的 ID 映射到 CountDownLatch es。执行查询时,代码如下所示:

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();
}

此方法从一个线程调用,该线程从底层系统读取所有传入结果(只有一个这样的读取器线程)。

首先,我不确定线程​​安全性,但似乎也没有必要为此使用两个 HashMap(特别是因为 ID 永远不会被重用)。有什么改进的想法吗?

最佳答案

this answer to a similar question启发的新尝试:

public class ResultFuture {

private volatile Result result = null;
private final CountDownLatch latch = new CountDownLatch(1);

public Result get() throws InterruptedException {
latch.await();
return result;
}

public void set(Result result) {
this.result = result;
latch.countDown();
}
}

现在我只需要这些 ResultFuture 中的一个 HashMap:

public Result execute(Query query) throws InterruptedException {
int id = atomicInteger.incrementAndGet();
ResultFuture resultFuture = new ResultFuture();
resultFutureMap.put(id, resultFuture);
query.executeAsyncWithId(id); // Probably returns before result is ready
try {
return resultFuture.get(); // Blocks until result is ready
} finally {
resultFutureMap.remove(id);
}
}

public void handleResult(Result result) {
int id = result.getId();
ResultFuture resultFuture = resultFutureMap.get(id);
if (resultFuture == null) {
return; // Nobody wants result
}
resultFuture.set(result);
}

关于java - 使异步查询同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com