ThreadPoolExecutor
和ScheduledThreadPoolExecutor
线程安全吗?
现在,我有一个场景如下:
ThreadPoolExecutor
(s)(我希望上面的情况很清楚)。
此外,所有执行程序在对象级别都是通用的。 在A级,最多只有4-5个作业并行执行并准备下一个级别(B)各种单独的作业/交易。 B级的工作又为C级准备工作,C级为D级工作做准备。
Exec5是一个持久化程序,它将所有数据保存到数据库中。
问题是C级和C级的工作岗位正在丢失。 D ie,尤其是当有许多同时线程试图异步地在后续执行器任务列表中推送更新的作业时。
RejectionHandler
中没有一个也收到任何被拒绝的处理程序。
此外,如果ThreadPoolExecutors
中的每一个都缩减为单个线程池执行程序(仅{1}}),我不会遇到任何问题。
这些工作本质上非常小,因此并行性确实为活动提供了显着的优势。
我希望我已经清楚了。
请指教。 问候, KT
答案 0 :(得分:2)
您如何向ExecutorService
提交作品?您使用的是submit(Callable)
还是execute(Runnable)
?在前一种情况下,调用代码有责任通过在返回的get()
上调用Future
来检测任何异常情况。因此,如果您的执行者只是将工作传递给下一个执行者并丢弃Future
任何错误都将被检测不到。
一种解决方法是使用execute(Runnable)
并覆盖ThreadPoolExecutor
的{{1}}方法,以便在使用非空afterExecute(Runnable r, Throwable t)
调用时发出提醒。
另一种解决方案是将执行程序包装在Throwable
中,并使用专用线程删除已完成的CompletionService
和“提取”和例外。
除此之外,这种架构似乎相当复杂。是否真的需要5级执行者?为什么不从一个Future
开始执行所有必需的步骤?设计越简单,就越容易发现任何问题。