Java创建线程池详解(7种常见方式)

Java创建线程池详解(7种常见方式)-mikechen

Java创建线程池是Java多线程并发编程必备技能,下面详解7种常见的Java创建线程池方式@mikechen

创建固定大小的线程池

newFixedThreadPool(int nThreads): 创建固定大小的线程池,线程数量固定不变。

示例:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

适用场景:

适合在任务数量固定且较小的情况下,例如 Web 服务器接收的请求。

 

创建自动调整大小的线程池

Executors.newCachedThreadPool() ,它返回一个可自动调整大小的线程池。

示例:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

适用场景:

这个线程池适用于需要执行许多短期异步任务的情况,它会根据需要创建新的线程,如果线程闲置,会在一段时间后将其回收。

 

创建单一线程的线程池

newSingleThreadExecutor(): 创建只有一个工作线程的线程池。

示例:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

适用场景:

适合需要保证任务顺序执行的场景,比如:日志处理。

 

创建定时周期任务执行的线程池

创建一个支持定时和周期性任务执行的线程池,示例:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

适用场景:

适合需要执行定时任务或周期性任务的场景,比如:定时数据备份、定时报表生成。

 

创建工作窃取线程池

使用 Executors.newWorkStealingPool(int parallelism),示例:

ExecutorService workStealingPool = Executors.newWorkStealingPool();

适用场景:

适合计算密集型任务,其中任务需要占用大部分 CPU 资源,例如:科学计算。

创建自定义线程池

使用 ThreadPoolExecutor 构造函数,创建自定义线程池。

示例:

int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
        corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler);

可以根据需求设置核心线程数、最大线程数、任务队列、拒绝策略等,自定义线程池。

适用场景:

适合需要精细控制线程池行为和参数的场景,可以根据应用需求灵活配置。

 

使用 ForkJoinPool创建

创建支持递归分治任务的线程池,适用于大规模并行计算任务。

示例:

ForkJoinPool forkJoinPool = new ForkJoinPool();

适用场景:

适合大规模并行计算任务,特别是分治算法的实现,如归并排序、并行遍历等。

以上就是常见的7种Java线程池创建方式,更多内容请查看:Java线程池(万字图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法