线程池配置主要会涉及到7大参数,下面重点详解7大线程池配置@mikechen
线程池参数配置
线程池参数,如下所示:
ThreadPoolExecutor threadPool = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler);
主要会涉及到:corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler。
重点是要理解上面的这几个参数,就可以搞清楚线程池配置了。
核心线程数(Core Pool Size)
核心线程数是线程池中保持的活动线程数量,即使线程处于空闲状态也不会被回收。
适用于维护基本的活动线程数,以减少线程创建和销毁的开销。
示例:
int corePoolSize = 5; ThreadPoolExecutor threadPool = new ThreadPoolExecutor( corePoolSize, Integer.MAX_VALUE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
最大线程数(Max Pool Size)
最大线程数是线程池允许的最大线程数量,示例:
int maxPoolSize = 10; ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 0, maxPoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
如果任务数量超过核心线程数,且任务队列已满,线程池会创建新线程,直到达到最大线程数。
线程存活时间(Keep-Alive Time)
非核心线程在空闲一段时间后会被销毁,以减少资源消耗,该参数定义了空闲线程的存活时间。
示例:
long keepAliveTime = 60; // 60 seconds TimeUnit unit = TimeUnit.SECONDS; ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 0, Integer.MAX_VALUE, keepAliveTime, unit, new SynchronousQueue<>());
合理设置可以避免因任务突发而频繁地创建和销毁线程。
时间单位(Time Unit)
用于指定核心线程数、最大线程数和线程存活时间的时间单位,如秒、毫秒等。
任务队列(Work Queue)
任务队列用于存储等待执行的任务,可以是有界队列或无界队列。
示例:
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); // Bounded queue with capacity 100 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);
任务队列用于:控制任务的排队和限制任务数量。
拒绝策略(Rejected Execution Policy)
拒绝策略定义了当线程池无法处理新任务时的行为,示例:
RejectedExecutionHandler handler = (r, executor) -> { // Custom rejection logic System.out.println("Task rejected: " + r.toString()); }; ThreadPoolExecutor threadPool = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler);
可选策略有:抛出异常、丢弃任务、丢弃最老的任务、由调用线程执行任务。
根据应用需求选择适当的拒绝策略。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》