我在我的一个Android组件中使用Java ThreadPoolExecutor。我的问题是:
在对TPE执行某些任务后,使用setRejectedExecutionHandler()设置RejectedExecutionHandler是一个好习惯吗?
我的意思是这样做有任何副作用。这是一个好习惯吗?
被修改
我需要在Android中创建一个可供其他项目使用的ThreadPoolManagementLibrary项目。现在,我需要在我的组件中公开TPE的公共方法。如果我让用户设置RejectedExecutionHandler那么这会有问题吗?
答案 0 :(得分:3)
问题应该是"我们应该处理RejectedExecutionException吗?"。答案当然是肯定的。不这样做会使发生它的线程崩溃,即线程提交任务执行,应用程序将继续在未知状态下运行。
第二个问题是"我们应该怎样处理这个例外?"。我们应该尽可能干净地停止应用程序。对于其他运行时异常(以及错误,顺便说一句)也是如此,一种解决方案是使用UncaughtExceptionHandler。但是如果我们想以特定方式处理RejectedExecutionException,我们可以使用RejectedExecutionHandler。这可用于在停止应用程序之前执行某些特定处理(直接或通过抛出将被UncaughtExceptionHandler捕获的新RuntimeException)。
这里的要点是应该处理所有异常和错误。这违反了所谓的最佳做法",但这些做法是错误的。对于单线程应用程序,它们是正确的。世界发生了变化。运行时异常或错误将使发生它的线程崩溃,而不是应用程序崩溃。所以它必须处理。
当然,如果您使用的是框架或应用程序服务器,问题可能会有所不同,因为此服务器或框架可能会为您处理未捕获的异常。
答案 1 :(得分:2)
我不这么认为。让我们试着了解RejectedExecutionHandler的作用?
当您向ThreadPoolExecutor提交任务时,会发生以下事件序列:
所以基本上,如果你允许用户设置自己的处理程序,那么你就可以自由地以自己的方式处理被拒绝的任务。他们在实施时应该小心。
答案 2 :(得分:0)
我也同意@ user2120553。
@Braj Kishore提到的所有观点都是正确的,但我想提一下,如果我们宣布我们的自定义RejectedExecutionHandler
,那么我们肯定会有机会重试执行。