Skip to content

ThreadPoolExecutor

About 1110 wordsAbout 4 min

2025-06-02

参考:

一、ThreadPoolExecutor源码

public void shutdown()

public void shutdown() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        advanceRunState(SHUTDOWN);
        interruptIdleWorkers();
        onShutdown(); // hook for ScheduledThreadPoolExecutor
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
}

public List<Runnable> shutdownNow()

拒绝策略

当线程池的线程数达到最大线程时,且还在向阻塞队列中添加任务时,需要执行拒绝策略。

拒绝策略需要实现RejectedExecutionHandler接口,并实现rejectedExecution(Runnable r, ThreadPoolExecutor e)方法。下面是框架定义好的四种拒绝策略。

1、CallerRunsPolicy

由调用线程处理该任务。

2、AbortPolicy

直接抛出异常。

public static class AbortPolicy implements RejectedExecutionHandler {

    public AbortPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " + e.toString());
    }
}

3、DiscardPolicy

rejectedExecution方法体中什么也不做,直接抛弃当前任务(最新的任务)。

public static class DiscardPolicy implements RejectedExecutionHandler {
    public DiscardPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}

4、DiscardOldestPolicy

抛弃进入队列最长时间的任务。

public static class DiscardOldestPolicy implements RejectedExecutionHandler {
    public DiscardOldestPolicy() { }
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
      	// 判断线程池是否运行
        if (!e.isShutdown()) {
          	// 抛弃队首元素
            e.getQueue().poll();
          	// 执行当前任务
            e.execute(r);
        }
    }
}

二、手写线程池

2.1、MyThreadPool类

2.2、RejectHandler接口

package dhh.project.config;

/**
 * 拒接策略
 *
 * @author 邓聪
 * @since 2025/6/2 11:28
 */
public interface RejectHandler {

    void reject(Runnable rejectCommand, MyThreadPool myThreadPool);
}

2.3、ThrowRejectHandler实现类

package dhh.project.config;

public class ThrowRejectHandler implements RejectHandler {
    @Override
    public void reject(Runnable rejectCommand, MyThreadPool myThreadPool) {
        throw new RuntimeException("阻塞队列满了!");
    }
}

2.4、DiscardRejectHandler实现类

package dhh.project.config;

public class DiscardRejectHandler implements RejectHandler {
    @Override
    public void reject(Runnable rejectCommand, MyThreadPool myThreadPool) {
        myThreadPool.blockingQueue.poll();
        myThreadPool.execute(rejectCommand);
    }
}

2.5、主方法

2.6、问题

  • 你能给线程池增加一个shutdown的功能吗?
  • 面试官问你:你怎么理解拒绝策略?如何回答
  • JDK的线程池还有一个ThreadFactory的参数,它是干什么的?

Changelog

6/3/25, 1:49 AM
View All Changelog
  • d3a6d-Merge branch 'dev1'on

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!