Executors线程池创建方式及线程核心参数配置

本文详细介绍了Java中Executors线程池的创建方式,包括newFixedThreadPool和newScheduledThreadPool等,并探讨了线程池的核心参数如最大线程数、核心线程数、活跃时间和阻塞队列。此外,还讲解了线程池的四种拒绝策略及其应用场景,为理解和优化线程池提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录


前言

为什么要用线程池,因为“池”的思想就是以空间换时间,就像数据库连接池一样,好处就是:1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Executors常用的线程池类型

newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。
newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

二、线程池中队列常用类型

ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue 一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于 ArrayBlockingQueueSynchronousQueue 一个不存储元素的阻塞队列。
PriorityBlockingQueue 一个具有优先级的无限阻塞队列。 PriorityBlockingQueue 也是基于最小二叉堆实现
DelayQueue只有当其指定的延迟时间到了,才能够从队列中获取到该元素。
DelayQueue 是一个没有大小限制的队列,
因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费
者)才会被阻塞。

三、线程池原理、以及核心参数

1. 最大线程数maximumPoolSize
2. 核心线程数corePoolSize
3. 活跃时间keepAliveTime
4. 阻塞队列workQueue
5. 拒绝策略RejectedExecutionHandler

四、线程池的拒绝策略

1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
2. CallerRunsPolicy:只用调用者所在的线程来处理任务
3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
4. DiscardPolicy:直接丢弃任务,也不抛出异常

五、java实现创建线程池

1、newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程

package com.zrrd.XianCheng;
import 
<think>好的,用户想了解如何在Java创建线程池以及设置核心参数。首先,我需要回忆Java线程池的相关知识,特别是ThreadPoolExecutor类。记得线程池核心参数包括corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory和handler。这些参数在构造方法中都有体现。 接下来,用户可能需要具体的配置步骤和示例代码。需要详细解释每个参数的作用,比如corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是非核心线程的空闲存活时间等。同时,还要说明不同参数配置的影响,比如任务队列的选择对线程池行为的影响。 用户可能对如何实际创建线程池感兴趣,比如使用Executors工具类或者直接通过ThreadPoolExecutor的构造方法。需要比较两者的优缺点,比如Executors提供的工厂方法虽然方便,但可能隐藏了一些配置细节,而直接使用构造方法更灵活。 另外,用户可能关心线程池配置策略,比如如何根据任务类型(CPU密集型、IO密集型)来设置线程数。需要给出一些常见的配置建议,比如CPU密集型任务通常设置核心线程数为CPU核心数+1,而IO密集型任务可能需要更多的线程。 还需要提到线程工厂threadFactory的作用,比如自定义线程名称或守护线程状态,这有助于调试和监控。拒绝策略也是一个重点,需要解释四种内置策略以及如何自定义。 最后,要确保回答结构清晰,分步骤讲解,并附上示例代码,帮助用户理解如何实际应用这些配置。同时,生成的相关问题要覆盖用户可能进一步想了解的内容,比如参数调优、队列选择、异常处理等。</think>### Java线程池核心参数配置教程 #### 一、线程池核心参数说明 Java线程池通过$ThreadPoolExecutor$类实现,其构造方法包含7个核心参数[^2]: 1. **corePoolSize(核心线程数)** 默认保留的空闲线程数,即使处于空闲状态也不会被回收 $$示例值:Runtime.getRuntime().availableProcessors() + 1$$ 2. **maximumPoolSize(最大线程数)** 线程池允许创建的最大线程数量 $$推荐配置:CPU密集型任务设为CPU核心数+1,IO密集型设为2*CPU核心数$$ 3. **keepAliveTime(空闲存活时间)** 非核心线程的空闲存活时间,超时后自动销毁 $$单位配合unit参数使用,如TimeUnit.SECONDS$$ 4. **unit(时间单位)** 支持$NANOSECONDS$、$MICROSECONDS$、$MILLISECONDS$、$SECONDS$等时间单位 5. **workQueue(任务队列)** 常用队列类型: - $LinkedBlockingQueue$(默认无界队列) - $ArrayBlockingQueue$(有界队列) - $SynchronousQueue$(直接传递队列) 6. **threadFactory(线程工厂)** 可自定义线程名称、优先级、守护线程属性等[^4] ```java ThreadFactory customFactory = r -> { Thread t = new Thread(r); t.setName("Worker-"+System.currentTimeMillis()); return t; }; ``` 7. **handler(拒绝策略)** 当队列线程池都满载时触发的策略: - $AbortPolicy$(默认,抛出异常) - $CallerRunsPolicy$(调用者线程执行) - $DiscardOldestPolicy$(丢弃最旧任务) - $DiscardPolicy$(静默丢弃) #### 二、线程池创建步骤 ##### 方式1:通过构造方法创建 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( 4, // corePoolSize 8, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() ); ``` ##### 方式2:使用Executors工厂方法 ```java // 固定大小线程池 ExecutorService fixedPool = Executors.newFixedThreadPool(4); // 可缓存线程池 ExecutorService cachedPool = Executors.newCachedThreadPool(); // 单线程池 ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); ``` #### 三、配置建议 1. **CPU密集型任务** 推荐$corePoolSize = CPU核心数 + 1$ $$示例:8核CPU配置为9$$ 2. **IO密集型任务** 推荐$corePoolSize = 2 \times CPU核心数$ $$示例:8核CPU配置为16$$ 3. **队列选择原则** - 需要流量控制时使用有界队列 - 需要快速响应使用$SynchronousQueue$ - 需要缓冲使用$LinkedBlockingQueue$ #### 四、验证配置示例 ```java public class ThreadPoolDemo { public static void main(String[] args) { ThreadPoolExecutor pool = new ThreadPoolExecutor( 2, 5, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new CustomThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy() ); // 提交20个任务 for (int i = 0; i < 20; i++) { pool.execute(() -> { System.out.println(Thread.currentThread().getName() + "执行任务"); try { Thread.sleep(1000); } catch (InterruptedException e) {} }); } pool.shutdown(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰太狼RD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值