java自定义线程池是什么,有哪些参数?

Java自定义线程池及其核心参数解析

在 Java 中,自定义线程池指的是通过手动创建 ThreadPoolExecutor 实例(而非使用 Executors 工具类提供的默认线程池),并根据业务需求灵活配置核心参数,以实现更合理的线程资源管理。

使用 Executors 工具类(如 Executors.newFixedThreadPool())创建的线程池虽然简单,但可能存在隐藏风险(如无界队列导致内存溢出)。而自定义线程池通过显式配置参数,能更好地适配实际业务场景(如控制并发量、避免资源耗尽等)。

自定义线程池的核心参数(ThreadPoolExecutor 构造方法参数)

ThreadPoolExecutor 的核心构造方法包含 7 个参数,分别控制线程池的行为逻辑,具体如下:

public ThreadPoolExecutor(
    int corePoolSize,                // 1. 核心线程数
    int maximumPoolSize,             // 2. 最大线程数
    long keepAliveTime,              // 3. 空闲线程存活时间
    TimeUnit unit,                   // 4. 时间单位
    BlockingQueue<Runnable> workQueue, // 5. 工作队列
    ThreadFactory threadFactory,     // 6. 线程工厂
    RejectedExecutionHandler handler // 7. 拒绝策略
)
1. 核心线程数(corePoolSize
  • 线程池长期保持的最小线程数量(即使线程空闲也不会被销毁,除非设置了 allowCoreThreadTimeOut 为 true)。
  • 当新任务提交时,若当前线程数 < 核心线程数,线程池会优先创建新线程执行任务;若已达到核心线程数,则将任务放入工作队列。
2. 最大线程数(maximumPoolSize
  • 线程池允许创建的最大线程数量(核心线程数 + 临时线程数)。
  • 当工作队列已满,且当前线程数 < 最大线程数时,线程池会创建临时线程执行新任务;若已达到最大线程数,则触发拒绝策略。
3. 空闲线程存活时间(keepAliveTime
  • 超过核心线程数的 “临时线程” 在空闲状态下的存活时间。
  • 若临时线程空闲时间超过该值,会被销毁,以节省资源。
4. 时间单位(unit
  • 配合 keepAliveTime 使用,指定存活时间的单位(如 TimeUnit.SECONDS 表示秒,TimeUnit.MILLISECONDS 表示毫秒)。
5. 工作队列(workQueue
  • 用于存放等待执行的任务的阻塞队列(必须是 BlockingQueue 实现类)。
  • 常见队列类型:
    • ArrayBlockingQueue:有界数组队列(需指定容量,避免内存溢出);
    • LinkedBlockingQueue:链表队列(默认无界,建议手动指定容量);
    • SynchronousQueue:同步队列(不存储任务,直接传递给线程,适合任务执行快的场景);
    • PriorityBlockingQueue:优先级队列(按任务优先级排序执行)。
6. 线程工厂(threadFactory
  • 用于创建新线程的工厂,可自定义线程的名称、优先级、是否为守护线程等。
  • 默认使用 Executors.defaultThreadFactory(),但建议自定义(如命名线程为 业务名-线程池-序号,便于问题排查)。
7. 拒绝策略(handler
  • 当线程池和工作队列都满了(即无法处理新任务)时,对新提交任务的处理策略。

  • 示例:创建自定义线程池

    import java.util.concurrent.*;
    
    public class CustomThreadPoolExample {
        public static void main(String[] args) {
            // 自定义线程工厂(指定线程名称)
            ThreadFactory threadFactory = new ThreadFactory() {
                private int count = 0;
                @Override
                public Thread newThread(Runnable r) {
                    Thread thread = new Thread(r);
                    thread.setName("custom-pool-" + count++); // 线程命名
                    thread.setDaemon(false); // 非守护线程
                    return thread;
                }
            };
    
            // 创建自定义线程池
            ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,                  // 核心线程数:2
                5,                  // 最大线程数:5
                30,                 // 空闲线程存活时间:30秒
                TimeUnit.SECONDS,   // 时间单位:秒
                new ArrayBlockingQueue<>(10), // 工作队列:容量为10的有界队列
                threadFactory,      // 线程工厂
                new ThreadPoolExecutor.AbortPolicy() // 拒绝策略:中止策略
            );
    
            // 提交任务
            for (int i = 0; i < 20; i++) {
                int taskId = i;
                threadPool.submit(() -> {
                    System.out.println("任务" + taskId + "由线程" + Thread.currentThread().getName() + "执行");
                    try {
                        Thread.sleep(1000); // 模拟任务执行
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            }
    
            // 关闭线程池
            threadPool.shutdown();
        }
    }

总结

自定义线程池的核心是通过 ThreadPoolExecutor 的 7 个参数,灵活控制线程创建、任务排队、资源回收和任务拒绝的逻辑,从而适配不同业务场景(如高并发处理、资源敏感型任务等),避免默认线程池的潜在风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值