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面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》