Java面试题之多线程 如果你提交任务时,线程池队列已满。会时发会生什么?
在Java中,如果你使用线程池(例如 ThreadPoolExecutor
)提交任务时,线程池的队列已满,会发生以下情况,具体取决于你在创建线程池时所选择的拒绝策略(Rejection Policy)。
ThreadPoolExecutor
提供了四种默认的拒绝策略:
AbortPolicy(默认策略):
RejectedExecutionException
。这意味着提交的任务会被拒绝,调用者需要处理这个异常。CallerRunsPolicy:
DiscardPolicy:
DiscardOldestPolicy:
在创建 ThreadPoolExecutor
时,你可以通过构造函数指定拒绝策略。例如:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(queueCapacity),
new ThreadPoolExecutor.AbortPolicy() // 这里可以选择不同的拒绝策略
);
选择合适的拒绝策略取决于你的应用场景和对任务丢失的容忍度。