线程池的创建有哪几种方法?线程池的创建需要设置哪些参数?
Executors工厂类提供了几种常见的线程池创建方法,使用简单,适用于大多数场景。同时ThreadPoolExecutor提供了更灵活的线程池创建方式,可以通过自定义参数来满足特殊需求。
Executors工厂类
-
Executors.newFixedThreadPool(int nThreads):创建一个固定大小的线程池,池中的线程数量始终保持不变。
-
Executors.newScheduledThreadPool(int corePoolSize):创建一个定长线程池,支持定时及周期性任务执行。
-
Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
-
Executors.newCacheThreadPool():创建一个可缓存的线程池,如果线程池的当前线程数小于核心线程数,则创建新线程执行任务;否则,将任务放入缓存队列中。缓存型池子通常用于执行一些生存期很短的异步型任务。
ThreadPoolExecutor自定义
-
corePoolSize:核心线程数。线程池中始终保持的线程数量,即使这些线程处于空闲状态。
-
maximumPoolSize:最大线程数。线程池中允许的最大线程数量。如果队列已满且线程数达到最大值,新的任务会被拒绝。
-
keepAliveTime:线程空闲时间。当线程数大于核心线程数时,多余的线程(非核心线程)在空闲时间后会被终止。
-
unit:keepAliveTime 的时间单位。
-
workQueue:任务队列。用于存储等待执行的任务。常见的阻塞队列有 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。
-
threadFactory:线程工厂,用于创建新线程,可以自定义线程工厂来设置线程名称、优先级等。
-
handler:拒绝策略。当线程池已满且队列已满时,新的任务会被拒绝。常见的拒绝策略有:AbortPolicy:直接抛出异常。CallerRunsPolicy:由调用线程执行任务。DiscardPolicy:静默丢弃任务。DiscardOldestPolicy:丢弃队列中最旧的任务。
示例代码
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 线程空闲时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
);
//代码示例
int corePoolSize = 5;
int maximumPoolSize = 10;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
ThreadFactory threadFactory= Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler
);
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。