首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS中的Java 8并发性?

AWS中的Java 8并发性?
EN

Stack Overflow用户
提问于 2019-06-01 01:16:47
回答 1查看 2K关注 0票数 2

我们有一个AWS函数,它需要通过调用远程服务来执行一些检查。只要其中一个返回false,lambda就可以返回;否则,所有检查都需要完成,以确保没有返回false。现在,我使用一个并行流来运行这些任务,因为它们可以独立运行。

在可能并不罕见的情况下,主线程返回时,其中一个任务仍与其线程一起运行,或线程阻塞等待I/O,因为短路已发现与另一个任务的错误。AWS文档指出,当主线程返回时,lambda中的所有线程都将被冻结。一旦lambda处理下一个请求,他们就会解冻。在重新激活后,繁忙/阻塞线程将继续处理原始任务,还是它将承担当前请求的新任务?

如果兰达大师能分享一些见解,我会很感激的。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 00:07:53

我希望我理解正确。您希望在等待它们完成时执行并行活动。

我刚在StackOverflow上读到一条评论说:

流是关于数据并行性的;数据并行问题是CPU绑定的,而不是IO绑定的.看起来,您只是想同时运行一些大部分无关的IO密集型任务。为此使用一个普通的线程池;您的第一个示例是ExecutorService.invokeAll()的理想候选。

也许ExecutorService能帮上忙。

我不知道您的代码是如何构造的,但我可以提出如下建议:

代码语言:javascript
复制
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors);

List<Callable<Boolean>> services = getURLToCheck().parallelStream()
       .map(this::checkService)
       .collect(Collectors.toList());

try {
    List<Future<Boolean>> futures = executorService.invokeAll(services);
    // do your validation with the concurrent tasks. 
} catch (InterruptedException e) {
    // Handle as you wish
}

其中还包括:

代码语言:javascript
复制
private List<URL> getURLToCheck() {
    // Fetch your URL from wherever :)
}

private Callable<Boolean> checkService(URL url){
    // Logic to check the service
}

Future类必须有可能对您有用的关键方法。isDone()方法和.get()

第一个指示任务是否完成,第二个将等待它完成抛出发生在内部但包装在ExecutionException中的所有异常。也许您可以结合这些方法来完成验证。经过快速思考,我设想了一个while循环,在这个循环中,您会询问未来是否完成,如果是的话,则有验证结果,如果结果为false,则中断该循环。但我不喜欢它哈哈。

希望我说得很清楚。我也希望这能帮上忙。如果没有,我已经尽力了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56403197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档