java - CompletableFuture 总是抛出超时异常
问题描述
我有一段代码如下
protected List<AMQMessage> waitForReceivedRawMessageFromActiveMq(AMQConsumerMessageListener listener) {
CompletableFuture<List<AMQMessage>> completableFuture = CompletableFuture.supplyAsync(() -> {
while (listener.getMessageList().isEmpty()) {}
return listener.getMessageList();
});
List<AMQMessage> rawMessage = Lists.newLinkedList();
try {
rawMessage = completableFuture.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
return rawMessage;
}
它总是抛出TimeoutException
,我不知道发生了什么。但是当我在 IDEA 中切换调试点时,它就可以工作了。有没有人可以为我解释一下,pleaseeee。
解决方案
这是由于同步不足而发生的。您正在更新某个线程中的listener
's ,但正在运行您的线程(默认情况下为commonPool 的工作线程)没有看到该更改,因此循环将永远运行。有时它可能会看到这种变化,但不能保证。也许调试器以不同的方式处理线程的内存可见性。messageList
supplyAsync()
ForkJoin
while
解决方案:尝试添加synchronized
到您的getMessageList()
和setMessageList()
方法。和/或使用同步列表(如Collections.synchronizedList(...)
orCopyOnWriteArrayList
等),具体取决于您是更新列表变量的引用还是更新其内容。
推荐阅读
- javascript - 如何修复“语法错误:意外的令牌:”
- javascript - 我对 Firestore 的 Cloud 函数的 onCreate 函数有疑问
- google-chrome - Vuex 在 Chrome 中的奇怪行为
- java - 为什么我们在这段代码中使用 new 来调用方法?
- c++ - Qt继承和类构造函数混淆
- python-2.7 - with conn: AttributeError: __exit__ 使用套接字接收消息时
- java - 初始化时打印超出范围
- java - 每个 for 循环都打印在新行上,即使它不应该
- python - Python - 遍历一个列表并将每第 n 次迭代的 n 个值附加到一个向量
- javascript - 使用
在本地