ScheduledThreadPoolExecutor线程安全

时间:2010-07-30 14:16:52

标签: java multithreading

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

  • 5 ThreadPoolExecutor(s)
  • exec1(执行JobA(A级作业):最多4-5个作业的并行性),
  • exec2(执行JobB(由每个JobA内的List组成):每个JobA超过800-3000个作业),
  • exec3(执行并准备JobC(由每个JobB制作):每个JobB 2-3个工作)),
  • exec4(执行JobD(每个作业1-2个活动)),
  • exec5(等待所有工作完成,然后执行某些活动);

(我希望上面的情况很清楚)。

此外,所有执行程序在对象级别都是通用的。 在A级,最多只有4-5个作业并行执行并准备下一个级别(B)各种单独的作业/交易。 B级的工作又为C级准备工作,C级为D级工作做准备。

Exec5是一个持久化程序,它将所有数据保存到数据库中。

问题是C级和C级的工作岗位正在丢失。 D ie,尤其是当有许多同时线程试图异步地在后续执行器任务列表中推送更新的作业时。 RejectionHandler中没有一个也收到任何被拒绝的处理程序。 此外,如果ThreadPoolExecutors中的每一个都缩减为单个线程池执行程序(仅{1}}),我不会遇到任何问题。 这些工作本质上非常小,因此并行性确实为活动提供了显着的优势。

我希望我已经清楚了。

请指教。 问候, KT

1 个答案:

答案 0 :(得分:2)

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

一种解决方法是使用execute(Runnable)并覆盖ThreadPoolExecutor的{​​{1}}方法,以便在使用非空afterExecute(Runnable r, Throwable t)调用时发出提醒。

另一种解决方案是将执行程序包装在Throwable中,并使用专用线程删除已完成的CompletionService和“提取”和例外。

除此之外,这种架构似乎相当复杂。是否真的需要5级执行者?为什么不从一个Future开始执行所有必需的步骤?设计越简单,就越容易发现任何问题。