当前位置: 首页 > 知识库问答 >
问题:

如何等待多个Callable而不阻塞get()

杨昆
2023-03-14

我正在使用java Callable和ExecutorService执行计算:

ExecutorService threadExecutor = Executors.newCachedThreadPool();
for (TaskCallable task: tasks) {
    threadExecutor.submit(task);
}

我想让任务运行最多2分钟。但如果我打电话:

task.get(2, TimeUnit.MINUTES);

然后它就会立刻封锁!不要让我为其他任务分配超时,直到超时结束。

我可以用

threadExecutor.invokeAll(tasks, 2, TimeUnit.MINUTES);

但它返回的是未来列表,我不知道什么任务属于哪个未来。

共有2个答案

董高逸
2023-03-14

因为留档说:

返回:
表示任务的期货列表,其顺序与迭代器为给定任务列表生成的顺序相同,每个任务都已完成。

当你记住两件事时,这一切都会如期进行:

  • 仅对具有保证顺序的集合使用invokeAll(例如ArrayList,但没有HashMap)
宓弘壮
2023-03-14

使用等待终止。来自文档:

阻塞,直到所有任务在关闭请求后完成执行,或超时发生,或当前线程中断(以先发生的为准)。

boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
 类似资料:
  • 问题内容: 我有两个分开的阻塞队列。客户端通常使用第二个阻塞队列中的第一个来检索要处理的元素。 在某些情况下,客户端对两个阻塞队列中的元素感兴趣,无论哪个队列首先提供数据。 客户端如何并行等待两个队列? 问题答案: 您可以尝试在某种循环中使用该方法,以仅在指定时间量内等待一个队列,然后再轮询另一个队列。 除此之外,我会说在另一个线程上为每个队列运行阻塞操作并为您的主应用程序提供回调接口是另一个稍微

  • 本文向大家介绍Java countDownLatch如何实现多线程任务阻塞等待,包括了Java countDownLatch如何实现多线程任务阻塞等待的使用技巧和注意事项,需要的朋友参考一下 我这里需要通过多线程去处理数据,然后在所有数据都处理完成后再往下执行。这里就用到了CountDownLatch。把countdownlatch作为参数传入到每个线程类里,在线程中处理完数据后执行countdo

  • 我在调试应用程序时遇到了这个问题。它在这条线上阻塞,我不知道是什么原因造成的。我找不到任何答案或任何有同样问题的人。我不知道代码的哪一部分会导致这种情况发生。你对此有什么想法或经验吗?我正在使用

  • 我们在应用程序中使用了Stomp、SpringBoot和WebSockets。服务器应用程序执行以下操作:1)生成要推送给用户的消息;2)接受WebSocket连接;3)将消息推送给ActiveMQ stomp Broker。线程转储显示了大量与simpMessagingTemplate convertAndSendToUser API调用相关联的等待线程。 应用程序的两个实例在云中运行。该应用程

  • 我有一个应用程序,通过点击按钮(该数字被定义)用户创建任务(可调用)做一些计算。我希望任务完成时能够做出反应。使用Future.get()阻止应用程序。有什么方法可以在Callable返回结果时做出反应吗?

  • 我的布局有表面视图。有时当我的应用程序从后台切换到前台时,我会得到ANR。我认为原因是主线程被lock方法阻塞了。 最重要的部分是: