首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScheduledThreadPoolExecutor线程安全

ScheduledThreadPoolExecutor线程安全
EN

Stack Overflow用户
提问于 2010-07-30 14:16:52
回答 1查看 1K关注 0票数 0

ThreadPoolExecutorScheduledThreadPoolExecutor线程安全吗?现在,我有一个场景如下:

  • 5 ThreadPoolExecutor(s)
  • exec1 (执行JobA (A级作业):最大4-5个作业的并行性)、
  • exec2 (执行JobB (由每个JobA内的列表生成):每个JobA超过800-3000个作业)、
  • exec3 (执行和准备JobC (每个JobB生成):每个JobA 2-3个作业)、H 211H 112exec1 4(执行(每个作业1-2活动)),
  • exec5 (等待所有作业完成,然后执行某些活动);

(我希望上述情况是明确的)。

此外,在对象级别上,所有执行程序都是常见的。在A级,只有最多4-5个作业并行执行,并为下一个级别(B)的各种单个作业/事务做准备。B级的工作反过来为C级的工作做准备,而C级的职位则为D级的工作做准备。

Exec5是将所有数据持久化到DB的持久化器。

问题是,作业在C&D级别的某个地方丢失了,特别是当有许多同时执行的线程试图异步地在后续executors任务列表中推送更新的作业时。没有一个RejectionHandler也收到任何被拒绝的处理程序。此外,如果将每个ThreadPoolExecutors还原为单个线程池执行器(仅1 Thread ),我就不会遇到任何问题。作业本身是非常小的,因此并行性确实为活动提供了显著的优势。

我希望我已经说清楚了。

请给我建议。您好,KT

EN

回答 1

Stack Overflow用户

发布于 2010-07-30 14:24:50

您是如何将工作提交给您的ExecutorService的?您是在使用submit(Callable)还是execute(Runnable)?在前一种情况下,调用代码负责通过调用返回的Future上的get()来检测任何异常情况。因此,如果您的执行者只是将工作传递给下一个执行器并丢弃Future,那么任何错误都不会被检测到。

解决方法之一是使用execute(Runnable)并覆盖ThreadPoolExecutorafterExecute(Runnable r, Throwable t)方法,如果使用非空Throwable进行调用,则会引发警报。

另一种解决方案是将执行器封装在CompletionService中,并有一个专门的线程删除已完成的Future和“提取”和异常。

顺便说一句,这个架构似乎相当复杂。5级执行者真的有必要吗?为什么不从执行所有所需步骤的单个ThreadPoolExecutor开始呢?您的设计越简单,就越容易发现任何问题。

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

https://stackoverflow.com/questions/3372325

复制
相关文章

相似问题

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