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

Java 在执行某些任务后,是否为ThreadPoolExecutor设置自定义RejectedExecutionHandler?,java,threadpoolexecutor,Java,Threadpoolexecutor,我在我的一个Android组件中使用Java ThreadPoolExecutor。我的问题是: 在对TPE执行某些任务后,使用setRejectedExecutionHandler()设置RejectedExecutionHandler是否是一种好的做法 我的意思是这样做有副作用吗。这是一种好的做法吗 已编辑 我需要在Android中创建一个ThreadPoolManagementLibrary项目,该项目可供其他项目使用。现在,我需要在我的组件中公开TPE的公共方法。如果我让用户设置Reje

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

在对TPE执行某些任务后,使用setRejectedExecutionHandler()设置RejectedExecutionHandler是否是一种好的做法

我的意思是这样做有副作用吗。这是一种好的做法吗

已编辑


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

我不这么认为。让我们试着理解RejectedExecutionHandler是做什么的

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

  • 如果有任何工作线程是空闲的,并且可以运行此任务
  • 否则,它将尝试将此任务移动到workerqueue,如果任务空闲,工作线程将从该队列中提取该任务
  • 如果workerQueue也已满,则它将在可能的情况下尝试创建新线程(没有工作线程小于maxPoolSize)
  • 如果上述所有操作都失败,则任务将发送到处理程序,默认处理程序将抛出RejectedExecutionException

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

我不这么认为。让我们试着理解RejectedExecutionHandler是做什么的

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

  • 如果有任何工作线程是空闲的,并且可以运行此任务
  • 否则,它将尝试将此任务移动到workerqueue,如果任务空闲,工作线程将从该队列中提取该任务
  • 如果workerQueue也已满,则它将在可能的情况下尝试创建新线程(没有工作线程小于maxPoolSize)
  • 如果上述所有操作都失败,则任务将发送到处理程序,默认处理程序将抛出RejectedExecutionException
所以基本上,如果您允许用户设置他们自己的处理程序,那么您就给了他们以自己的方式处理被拒绝任务的自由。他们在实施时应该小心。

问题应该是“我们是否应该处理被拒绝的执行异常?”。答案当然是肯定的。如果不这样做,将使发生此操作的线程崩溃,即提交任务以执行的线程,并且应用程序将继续在未知状态下运行

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

这里的要点是应该处理所有异常和错误。这与所谓的“最佳实践”背道而驰,但这些实践是错误的。对于单线程应用程序,它们曾经是正确的。世界变了。运行时异常或错误将使发生异常或错误的线程崩溃,而不是应用程序崩溃。所以必须处理

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

问题应该是“我们是否应该处理被拒绝的执行异常?”。答案当然是肯定的。如果不这样做,将使发生此操作的线程崩溃,即提交任务以执行的线程,并且应用程序将继续在未知状态下运行

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

这里的要点是应该处理所有异常和错误。这与所谓的“最佳实践”背道而驰,但这些实践是错误的。对于单线程应用程序,它们曾经是正确的。世界变了。运行时异常或错误将使发生异常或错误的线程崩溃,而不是应用程序崩溃。所以必须处理


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

我也同意@user2120553。
@Braj Kishore提到的所有要点都是正确的,但我想指出的是,如果我们声明我们的自定义
拒绝执行处理程序
,那么我们肯定会有机会重试执行。

我也同意@user2120553。
@Braj Kishore提到的所有要点都是正确的,但我想说的是,如果我们声明我们的自定义
拒绝执行处理程序
,那么我们肯定会有机会重试执行。

为什么要这样做?“我认为拒绝政策应该是明确和稳定的。”亚西尔亚斯编辑了这个问题。你为什么要这样做?“我认为拒绝政策应该是明确和稳定的。”亚西尔亚斯编辑了这个问题。