RejectedExecutionException 是 Java 标准库中的一种异常,属于 java.util.concurrent 包。它通常在执行器框架(Executor Framework)中出现,当尝试提交任务到一个已关闭或已满的执行器时,就会抛出这个异常。
异常详情
异常是RejectedExecutionException,通常在任务无法被线程池接受执行时发生。
java.util.concurrent.RejectedExecutionException: Task cn.leadeon.logreading.service.impl.LogReaderService$$Lambda$733/368032417@1687c3fa rejected from java.util.concurrent.ThreadPoolExecutor@71059509[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
异常说明
- java.util.concurrent.RejectedExecutionException:这是被抛出的异常类型。它表示任务的执行已被拒绝。
- Task cn.leadeon.logreading.service.impl.LogReaderService$$Lambda$733/368032417@1687c3fa
- rejected:这个消息指明了被拒绝的任务。在这种情况下,它似乎是cn.leadeon.logreading.service.impl.LogReaderService的一个实例,由$$Lambda$733/368032417@1687c3fa标识的一个lambda表达式。
- java.util.concurrent.ThreadPoolExecutor@71059509[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]:这部分提供了线程池的信息。它显示了执行器的当前状态,包括池大小、活动线程、排队任务和已完成任务的数量。
RejectedExecutionException的具体原因可能是ThreadPoolExecutor使用的拒绝策略。在这种情况下,它似乎使用的是默认的AbortPolicy,当执行器由于配置原因无法接受新任务时,通过抛出RejectedExecutionException来拒绝任务。
解决方案
要解决此问题,你可以考虑以下几个选项:
- 增加线程池的容量:你可以调整ThreadPoolExecutor的池大小或允许的最大线程数,以同时处理更多的任务。
- 修改拒绝策略:可以实现自定义的拒绝策略,而不是使用默认的AbortPolicy,以不同的方式处理被拒绝的任务。例如,你可以记录拒绝信息或将任务添加到队列中以便稍后执行。
- 找出任务提交过多的来源:如果排队任务的数量不断增加,可能意味着应用程序中存在潜在问题。确保任务被适当地提交给执行器,并调查任何潜在的瓶颈或低效之处。