如何解决ExecutorService Submit-并行执行非阻塞
我正在尝试并行运行任务。我尝试了以下方法:
在我的构造函数中:
this.executor = Executors.newFixedThreadPool(5);
executor.awaitTermination(10,TimeUnit.SECONDS);
然后将要并行运行的所有项目添加到列表中
Future<Map.Entry<Location,SomeData>> result = this.executor.submit(new Sender(entry));
resultList.add(result);
然后我在该列表上循环并使用get()
的{{1}}函数来执行每个任务-似乎正在阻塞:
Future
发件人通话():
for (int i = 0; i < resultList.size(); i++) {
Future<Map.Entry<Location,SomeData>> result = resultList.get(i);
try {
logger.info("[Start] Task" + sendQueue.get(i).getKey() + "-" + i);
entry = result.get();
} catch (InterruptedException e) {
logger.error("Interrupted error",e);
} catch (ExecutionException e) {
logger.error("Thread Execution error",e);
} catch (Exception e) {
logger.error("Send Error",e);
}
if (entry == null) {
logger.error("Telemetry Send Error");
return;
}
logger.info("[Success] Task" + entry.getKey() + "-" + i);
}
我看到每个任务都在另一个之后执行。我想并行执行所有任务,并使其不阻塞。
知道我缺少什么吗? executor服务过去不是吗?
解决方法
在调用submit
之后,您需要调用awaitTermination
。这样,您将花一些时间执行任务,直到达到您定义的超时或执行结束。
然后,您应该可以通过调用get
来检查将来的结果。
ExecutorService
API提供的另一个选项是调用invokeAll
,这是一个触发所有任务的阻塞操作。我个人更喜欢上述第一种选择。
更新:另外,您没有显示ExecutorService
配置,但是我假设您为其分配了多个线程。否则,无论您在submit
之后执行什么操作,执行都是顺序的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。