首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadPoolExecutor挂起

ThreadPoolExecutor挂起
EN

Stack Overflow用户
提问于 2013-11-23 01:16:50
回答 1查看 1.1K关注 0票数 0

尝试调试一个竞争条件,其中一个应用程序的轮询线程永远不会返回,从而导致以后的计票程序永远不会被调度。在抽象的术语中,在捕捉问题的同时隐藏业务逻辑,下面是我们的代码路径。

我们必须更新远程服务器中资源Y的某些状态X。我们有一个资源管理器,它更改资源状态并更新X作为更改的副作用。这个管理器不断地轮询资源,当它相信资源被更新时,它就使用ThreadPoolExecutor来完成这项工作。这个线程池执行器有一个合理大小的阻塞队列,但是最大线程数量相当少。线程转储的挂起本身发生在invokeAll调用中(除其他外)

我们有理由相信,这个池执行器中的核心/最大线程数正忙着做其他事情(如果愿意的话,更多的资源状态更新)。

由于invokeAll返回我们等待的未来,所以问题是,即使执行器使用的阻塞数据结构足够大,能够接受通过invokeAll传递的工作,但没有足够的线程可用,invokeAll是否仍然挂起?

EN

回答 1

Stack Overflow用户

发布于 2013-11-23 03:40:41

正如其他用户所指出的那样,如果没有一些代码(甚至是伪代码),并且对什么是“状态X”和什么是“资源Y”有更清晰的理解,这里的任何人几乎不可能提供一个明智的答案。简而言之,您需要一个SSCCE。无论如何,我会尽我最大的努力;-)。如果你做了邮政编码和/或提供更多的信息,我会相应地更新我的答案。

来自javadoc

执行给定的任务,返回持有其状态和结果的期货列表。对于返回列表的每个元素,Future.isDone()都是真的。请注意,已完成的任务可以正常结束,也可以通过抛出异常来终止。如果在进行此操作时修改了给定集合,则此方法的结果是未定义的。

从您的描述(而且,我也不能肯定,因为缺乏细节),您的一个工作线程挂。由于您正在调用invokeAll(...),所以执行器挂起,因为它正在等待挂起的线程完成。但从来没有。现在,关于为什么会有一个挂起的线程,这是一个完全不同的问题,我们肯定需要看到一些代码。HTH。

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

https://stackoverflow.com/questions/20157311

复制
相关文章

相似问题

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