1. 手写线程池,任务队列、Worker 循环、拒绝策略、优雅关闭如何实现?
请手写一个线程池,说明任务队列、Worker 循环、拒绝策略与优雅关闭如何实现?
- 核心线程与任务队列
- Worker 循环取任务执行
- 拒绝策略与优雅关闭
线程池核心是:维护一个任务队列(BlockingQueue)和一组 Worker 线程。提交任务时若线程数 < corePoolSize 则新建 Worker 立即执行;否则放入队列;队列满且线程数 < maxPoolSize 则新建 Worker;仍满则触发拒绝策略。Worker 循环从队列 take 任务执行,若无任务则阻塞等待。拒绝策略:AbortPolicy(抛异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy(丢弃)、DiscardOldestPolicy(丢弃最旧)。优雅关闭:shutdown 不再接受新任务并等待已提交任务完成,shutdownNow 中断并返回未完成任务;需等待所有 Worker 退出并清空队列。
线程池通过"核心线程 + 队列 + 非核心线程"分层应对突发流量,拒绝策略兜底。优雅关闭的关键是区分"新任务"与"已提交任务",并让 Worker 在队列空后退出而不是一直阻塞。
public class SimpleThreadPool {
private final BlockingQueue<Runnable> queue;
private final List<Worker> workers = new ArrayList<>();
private volatile boolean running = true;
public SimpleThreadPool(int coreThreads, int cap){
queue = new ArrayBlockingQueue<>(cap);
for (int i=0;i<coreThreads;i++){ Worker w=new Worker(); workers.add(w); w.start(); }
}
public void execute(Runnable task) {
if (!running) throw new RejectedExecutionException("已关闭");
queue.offer(task); // 满则拒绝
}
public void shutdown() {
running = false;
for (Worker w : workers) w.interrupt(); // 中断等待
}
class Worker extends Thread {
public void run() {
while (running || !queue.isEmpty()) {
try {
Runnable task = queue.poll(100, TimeUnit.MILLISECONDS);
if (task != null) task.run();
} catch (InterruptedException e) { /* 退出 */ }
}
}
}
}