MST

星途 面试题库

面试题:Java线程池拒绝策略的定制与应用

假设你正在开发一个高并发的订单处理系统,线程池处理订单任务。当线程池饱和时,现有的四种拒绝策略都无法满足需求,需要自定义一个拒绝策略,该策略需要将被拒绝的订单任务记录到日志中,并尝试在10分钟后重新提交到线程池。请写出实现该自定义拒绝策略的Java代码,并说明在订单处理系统中这样设计的好处。
11.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

自定义拒绝策略Java代码

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
    private static final Logger logger = Logger.getLogger(CustomRejectedExecutionHandler.class.getName());
    private final BlockingQueue<Runnable> queue;
    private final ThreadPoolExecutor executor;

    public CustomRejectedExecutionHandler(BlockingQueue<Runnable> queue, ThreadPoolExecutor executor) {
        this.queue = queue;
        this.executor = executor;
    }

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        logger.log(Level.SEVERE, "订单任务被拒绝: " + r.toString());
        // 尝试10分钟后重新提交任务
        new Thread(() -> {
            try {
                Thread.sleep(10 * 60 * 1000);
                if (!executor.isShutdown()) {
                    queue.offer(r);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

在订单处理系统中这样设计的好处

  1. 任务不丢失:通过记录日志和尝试重新提交任务,确保订单任务不会因为线程池饱和而丢失,保证了订单处理的完整性。
  2. 提高系统可靠性:即使在高并发情况下线程池饱和,系统也能尽力处理所有订单,增强了系统在压力下的可靠性。
  3. 可追溯性:将被拒绝的订单任务记录到日志中,方便后续排查问题和分析系统性能瓶颈。