千家信息网

Java线程池详细介绍

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要介绍"Java线程池详细介绍",在日常操作中,相信很多人在Java线程池详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java线程池详细介绍"的疑惑
千家信息网最后更新 2025年02月04日Java线程池详细介绍

这篇文章主要介绍"Java线程池详细介绍",在日常操作中,相信很多人在Java线程池详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java线程池详细介绍"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

之所以要使用线程池,是因为使用new Thread在大型项目中是有弊端的:

  1. 每次new Thread新建对象,性能差

  2. 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能会造成过多占用系统资源而导致OOM

  3. 缺少更多功能,如定期执行等

而线程池的好处:

  1. 重用存在的线程,减少对象创建、消亡的开销,性能佳

  2. 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞

  3. 提供定时执行、定期执行、单线程、并发数控制等功能

状态池的状态转换

线程池的类继承关系

  1. Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的

  2. ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等

  3. 抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法

  4. ThreadPoolExecutor继承了类AbstractExecutorService。

ThreadPoolExecutor的方法说明

  1. execute()实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行

  2. submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,去看submit()方法的实现,会发现它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果

  3. shutdown()优雅关闭线程池

  4. shutdownNow()强制关闭线程池

还有很多其他的方法:比如:getQueue() 、getPoolSize() 、getActiveCount()、getCompletedTaskCount()等获取与线程池相关属性的方法,可以用于线程池监控,有兴趣的朋友可以自行查阅API。

更多ThreadPoolExecutor配置的详细说明,点击查看:还在用Executors创建线程池?小心内存溢出

ScheduledExecutorService使用说明

@Slf4jpublic class ThreadPoolExample {
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// 延时任务// executorService.schedule(()->// log.warn("schedule run"), 3, TimeUnit.SECONDS);
// 固定速率任务 executorService.scheduleAtFixedRate(() -> log.warn("schedule run"), 1, 3, TimeUnit.SECONDS);// executorService.shutdown();
// Timer也能执行定时任务,不过还是推荐用ScheduledExecutorService// Timer timer = new Timer();// timer.schedule(new TimerTask() {// @Override// public void run() {// log.warn("timer run");// }// }, new Date(), 5 * 1000); }}

特别提示:通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么ScheduledExecutorService就会停止执行任务,而且也不会再周期地执行该任务了。所以如果想保持任务周期执行,需要catch一切可能的异常。

线程池核心线程数配置推荐

CPU密集型任务:尽量压榨CPU,参考值设置为NCPU+1
IO密集型任务:参考值可以设置为2*NCPU

相关的线程池

Spring的异步线程池

TaskExecutor是Spring异步线程池的接口,继承Java.util.concurrent.Executor接口

Spring已经实现的异步线程池(TaskExecutor的实现类):

  1. SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。

  2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方

  3. ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类

  4. SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类

  5. ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装

Spring的异步线程池的使用

  1. @Async将方法标注为异步方法,Spring扫描到后,执行该方法时,会另起新线程去执行,非常简单

  2. 为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync

@Async所修饰的函数不要定义为static类型,这样异步调用不会生效

到此,关于"Java线程池详细介绍"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

线程 方法 任务 接口 更多 学习 推荐 周期 资源 配置 功能 参考值 同时 实际 实际上 密集型 对象 性能 核心 状态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 苹果电脑腾讯云服务器怎么多开 网络安全纵深防控体系 第三届网络安全教育研修班 奉贤区品牌数据库系统销售协议 modus软件开发实战指南 数据库查询后生成电子表格保存 前台与数据库的连接 千兆比特网络技术 计算机网络技术2019答案 海泰互联网科技有限公司是国企吗 关于网络安全亮点 小学生网络安全教育知识美篇 软件开发哪些需要用到管理员权限 服务器硬件怎么开机 江苏慧博网络技术有限公司 政府办网络安全事件应急预案 2019网络技术三级大纲 实验室服务器价格 国家网络安全知乎 企业服务器大全 网络安全专业学硕干什么 方盛怡网络技术有限公司怎么样 正定县委网络安全和信息化 名字配对软件开发 如何利用分析数据库绘制直方图 郑州oracle数据库认证费用 软件开发需求分析说明书例子 信联互联网科技有限公司官网 王牌战士新手选哪个服务器 武汉归春河网络技术有限公司
0