执行某些任务后,为ThreadPoolExecutor设置自定义RejectedExecutionHandler?

时间:2013-08-14 09:31:46

标签: java threadpoolexecutor

我在我的一个Android组件中使用Java ThreadPoolExecutor。我的问题是:

在对TPE执行某些任务后,使用setRejectedExecutionHandler()设置RejectedExecutionHandler是一个好习惯吗?

我的意思是这样做有任何副作用。这是一个好习惯吗?

被修改

我需要在Android中创建一个可供其他项目使用的ThreadPoolManagementLibrary项目。现在,我需要在我的组件中公开TPE的公共方法。如果我让用户设置RejectedExecutionHandler那么这会有问题吗?

3 个答案:

答案 0 :(得分:3)

问题应该是"我们应该处理RejectedExecutionException吗?"。答案当然是肯定的。不这样做会使发生它的线程崩溃,即线程提交任务执行,应用程序将继续在未知状态下运行。

第二个问题是"我们应该怎样处理这个例外?"。我们应该尽可能干净地停止应用程序。对于其他运行时异常(以及错误,顺便说一句)也是如此,一种解决方案是使用UncaughtExceptionHandler。但是如果我们想以特定方式处理RejectedExecutionException,我们可以使用RejectedExecutionHandler。这可用于在停止应用程序之前执行某些特定处理(直接或通过抛出将被UncaughtExceptionHandler捕获的新RuntimeException)。

这里的要点是应该处理所有异常和错误。这违反了所谓的最佳做法",但这些做法是错误的。对于单线程应用程序,它们是正确的。世界发生了变化。运行时异常或错误将使发生它的线程崩溃,而不是应用程序崩溃。所以它必须处理。

当然,如果您使用的是框架或应用程序服务器,问题可能会有所不同,因为此服务器或框架可能会为您处理未捕获的异常。

答案 1 :(得分:2)

我不这么认为。让我们试着了解RejectedExecutionHandler的作用?

当您向ThreadPoolExecutor提交任务时,会发生以下事件序列:

  • 如果有任何免费的工作线程可以运行此任务。
  • 否则它会尝试将此任务移动到工作队列,工作者线程将在该工作队列中获取任务(如果它是空闲的)。
  • 如果workerQueue也已满,那么如果可能的话,它会尝试创建一个新线程(没有工作线程小于maxPoolSize)。
  • 如果上述所有操作都失败,那么任务将被发送到处理程序,默认处理程序将抛出RejectedExecutionException。

所以基本上,如果你允许用户设置自己的处理程序,那么你就可以自由地以自己的方式处理被拒绝的任务。他们在实施时应该小心。

答案 2 :(得分:0)

我也同意@ user2120553。 @Braj Kishore提到的所有观点都是正确的,但我想提一下,如果我们宣布我们的自定义RejectedExecutionHandler,那么我们肯定会有机会重试执行。