ThreadPoolExecutor和ScheduledThreadPoolExecutor线程安全吗?现在,我有一个场景如下:
ThreadPoolExecutor(s) 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
发布于 2010-07-30 14:24:50
您是如何将工作提交给您的ExecutorService的?您是在使用submit(Callable)还是execute(Runnable)?在前一种情况下,调用代码负责通过调用返回的Future上的get()来检测任何异常情况。因此,如果您的执行者只是将工作传递给下一个执行器并丢弃Future,那么任何错误都不会被检测到。
解决方法之一是使用execute(Runnable)并覆盖ThreadPoolExecutor的afterExecute(Runnable r, Throwable t)方法,如果使用非空Throwable进行调用,则会引发警报。
另一种解决方案是将执行器封装在CompletionService中,并有一个专门的线程删除已完成的Future和“提取”和异常。
顺便说一句,这个架构似乎相当复杂。5级执行者真的有必要吗?为什么不从执行所有所需步骤的单个ThreadPoolExecutor开始呢?您的设计越简单,就越容易发现任何问题。
https://stackoverflow.com/questions/3372325
复制相似问题