🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客
⭐每日一句:成为架构师路途遥远
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️
前言
Java中的RejectedExecutionHandler是一个接口,用于处理Executor中的任务被拒绝执行的情况。当Executor中的任务队列已满,并且无法再继续接受新的任务时,就会拒绝执行新的任务。这种情况可能发生在以下几种情况下:
- ThreadPoolExecutor中的任务队列已满,且maximumPoolSize已经达到上限。
- ThreadPoolExecutor已经被关闭,不再接受新的任务。
RejectedExecutionHandler接口只有一个方法:void rejectedExecution(Runnable r, ThreadPoolExecutor executor)。当任务被拒绝执行时,执行器会调用RejectedExecutionHandler的rejectedExecution方法来执行自定义的处理逻辑。
Java提供了几种内置的RejectedExecutionHandler实现类:
- ThreadPoolExecutor.AbortPolicy(默认):直接抛出RejectedExecutionException,阻止系统正常运行。
- ThreadPoolExecutor.CallerRunsPolicy:在调用execute方法的线程中直接执行被拒绝的任务,即任务在调用线程中同步执行。
- ThreadPoolExecutor.DiscardPolicy:直接丢弃被拒绝的任务,不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃任务队列中最旧的任务,然后尝试重新执行被拒绝的任务。
除了使用Java提供的内置实现类,开发人员还可以根据自己的需求实现自定义的RejectedExecutionHandler。例如,可以将被拒绝的任务记录到日志中,或者将其放到一个特定的队列中等待执行。