ExecutorService
ExecuteService是Executors创建的线程池
表述了异步执行的机制,并且可以让任务在后台执行
线程池体系结构
java.util.concurrent.Executor 负责线程的使用和调度的根接口
|--ExecutorService 子接口: 线程池的主要接口
|--ThreadPoolExecutor 线程池的实现类
|--ScheduledExceutorService 子接口: 负责线程的调度
|--ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor,实现了ScheduledExecutorService
4种类型线程池
ExecutorService newFixedThreadPool() : 创建固定大小的线程池
ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
ExecutorService newSingleThreadExecutor() : 创建单个线程池。 线程池中只有一个线程
ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务
常用的方法
(1)
execute(Runnable) 以异步的方式执行
eg:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Demo{ public static void main(String[] args) { System.out.println("start"); ExecutorService es1 = Executors.newSingleThreadExecutor(); es1.execute(new Runnable() { public void run() { try { Thread.sleep(1000); System.out.println("子线程:"+Thread.currentThread().getName()+"执行"); } catch (InterruptedException e) { e.printStackTrace(); } } }); es1.shutdown(); System.out.println("end"); } }
输出
start
end
子线程:pool-1-thread-1执行
(2)
submit(Runnable) 会返回Future 对象。Future 对象可以用于判断 Runnable 是否结束执行
eg:
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Demo { public static void main(String[] args) { System.out.println("start"); ExecutorService es1 = Executors.newSingleThreadExecutor(); Future future = es1.submit(new Runnable() { public void run() { try { Thread.sleep(1000); System.out.println("子线程:" + Thread.currentThread().getName() + "执行"); } catch (InterruptedException e) { e.printStackTrace(); } } }); try { //如果任务结束执行则返回 null System.out.println("future.get()=" + future.get()); }catch (Exception e) { e.printStackTrace(); } es1.shutdown(); System.out.println("end"); } }
输出
start 子线程:pool-1-thread-1执行 future.get()=null end
(3)
submit(Callable) 会返回Future 对象。Future 对象可以用于判断 Callable是否结束执行
eg:
import java.util.concurrent.*; public class Demo { public static void main(String[] args) { System.out.println("start"); ExecutorService es1 = Executors.newSingleThreadExecutor(); Future future = es1.submit(new Callable() { public Object call(){ try { Thread.sleep(1000); System.out.println("子线程:" + Thread.currentThread().getName() + "执行"); } catch (InterruptedException e) { e.printStackTrace(); } return "Callable Result"; } }); try { System.out.println("future.get()=" + future.get()); }catch (Exception e) { e.printStackTrace(); } es1.shutdown(); System.out.println("end"); } }
(4)
shutdown() 关闭
shutdownNow() 立即关闭
存在于 ExecutorService 中的活动线程会阻止Java虚拟机关闭
为了关闭在 ExecutorService 中的线程,需要调用 shutdown() 方法。
ExecutorService 并不会马上关闭,而是不再接收新的任务,但所有的线程结束执行当前任务,ExecutorServie 才会真的关闭
所有在调用 shutdown() 方法之前提交到 ExecutorService 的任务都会执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-04-01 自动化测试工具Ranorex的录制功能使用
2019-04-01 自动化测试工具Katalon简单使用
2019-04-01 thinkphp3.2在nginx下的配置
2019-04-01 mysql可以远程连接的配置
2017-04-01 git分支