跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

java中ExecutorService有几种创建方法

Java中ExecutorService需通过Executors工厂方法或手动构建ThreadPoolExecutor创建;常用方式包括newFixedThreadPool(固定线程数、无界队列)、newSingleThreadExecutor(单线程串行)、newCachedThreadPool(弹性线程、SynchronousQueue)和newScheduledThreadPool(定时任务);自Java 9起推荐显式构造ThreadPoolExecutor以控制参数。 Java 中
ExecutorService
本身是接口,不能直接 new,必须通过
Executors
工具类提供的静态工厂方法创建,或者手动实现(极少用)。常用且推荐的方式是使用
Executors
提供的几种标准创建方法,对应不同业务场景。 固定线程数的线程池(newFixedThreadPool) 创建一个可重用、固定数量线程的线程池。所有任务排队等待,线程数恒定,适合负载稳定、资源可控的场景。 底层基于
ThreadPoolExecutor
,核心线程数 = 最大线程数 = 指定值,队列默认是无界
LinkedBlockingQueue
注意:无界队列 + 固定线程可能导致 OOM(如任务提交速度远超执行速度) 示例:
ExecutorService pool = Executors.newFixedThreadPool(4);
单线程线程池(newSingleThreadExecutor) 内部只维护一个工作线程,所有任务串行执行,保证顺序性和线程安全性,适合需要按提交顺序处理的任务。 本质是
newFixedThreadPool(1)
的封装,但返回的是
FinalizableDelegatedExecutorService
,禁止调用
shutdownNow()
等破坏性操作 队列仍是无界,同样要注意堆积风险 示例:
ExecutorService pool = Executors.newSingleThreadExecutor();
可缓存的线程池(newCachedThreadPool) 适用于大量短生命周期、轻量级 异步任务 的场景。线程数不固定,空闲 60 秒自动回收,需要时新建线程(理论上无上限)。 Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”; 核心线程数为 0,最大线程数为
Integer.MAX_VALUE
,使用
SynchronousQueue
(不存储任务,直接移交) 高并发突发任务下可能创建过多线程,导致系统资源耗尽 示例:
ExecutorService pool = Executors.newCachedThreadPool();
定时任务线程池(newScheduledThreadPool) 支持延迟执行和周期性执行任务,是
ScheduledExecutorService
的实现,比
Timer
更健壮(线程安全、异常不中断调度)。 底层也是
ThreadPoolExecutor
扩展,支持
schedule
、
scheduleAtFixedRate
、
scheduleWithFixedDelay
注意:它不是普通
ExecutorService
的子集,而是扩展接口,但可向上转型使用 示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
重要提醒:自 Java 9 起,官方文档明确建议:优先使用
ThreadPoolExecutor
显式构造,避免用
Executors
工厂方法。因为它们隐藏了关键参数(如队列容量、拒绝策略、线程工厂),容易引发线上问题。生产环境更推荐手动构建,例如:
new ThreadPoolExecutor(4, 8, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue(100), new CustomThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
基本上就这些主流创建方式。用对方法的前提是理解背后线程池的参数逻辑,而不是只记名字。

相关文章