首页 > 编程语言 >Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项

Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项

时间:2024-03-30 10:01:02浏览次数:31  
标签:Java 队列 创建 任务 线程 executor new ThreadPoolExecutor

企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》

【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这 样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1) FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 2) CachedThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

  1. 创建线程池方式一:new ThreadPoolExecutor 方式
  1. ExecutorService executorService = new ThreadPoolExecutor(3,5,10, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
  2. for (int i = 0; i < 9; i++) {
  3.     executorService.execute(()->{
  4.         System.out.println(Thread.currentThread().getName() + "开始办理业务了。。。。。。");
  5.     });
  6. }
  1. 创建线程池方式二:spring的ThreadPoolTaskExecutor方式
  1. @Configuration
  2. public class ExecturConfig {
  3.     @Bean("taskExector")
  4.     public Executor taskExector() {
  5.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  6.         executor.setCorePoolSize(3);//核心池大小
  7.         executor.setMaxPoolSize(5);//最大线程数
  8.         executor.setQueueCapacity(3);//队列长度
  9.         executor.setKeepAliveSeconds(10);//线程空闲时间
  10.         executor.setThreadNamePrefix("tsak-asyn");//线程前缀名称
  11.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//配置拒绝策略
  12.         return executor;
  13.     }
  14. }

创建线程池的注意事项:

  1. 线程池的大小:线程池的大小应根据任务的类型和系统资源进行合理的配置。如果线程池的大小过小,可能会导致任务排队等待执行,影响系统的响应性能;如果线程池的大小过大,可能会占用过多的系统资源,导致系统负载过重。可以通过监控和调整线程池的大小来优化性能。
  2. 任务队列的选择:线程池通常会使用一个任务队列来保存待执行的任务。任务队列的选择应根据任务的特性进行合理的选择。如果任务较多且执行时间较短,可以选择无界队列(如LinkedBlockingQueue);如果任务较少且执行时间较长,可以选择有界队列(如ArrayBlockingQueue)或者优先级队列(如PriorityBlockingQueue)。
  3. 线程池的拒绝策略:当任务无法被线程池接收执行时,需要定义适当的拒绝策略。常见的拒绝策略有:抛出异常(AbortPolicy)、丢弃任务(DiscardPolicy)、丢弃最早的任务(DiscardOldestPolicy)和调用者运行任务(CallerRunsPolicy)。根据业务需求选择合适的拒绝策略。
  4. 线程池的生命周期管理:线程池的生命周期包括初始化、执行任务和关闭。在初始化时,需要设置线程池的参数;在执行任务时,需要提交任务到线程池;在关闭时,需要调用线程池的shutdown()或shutdownNow()方法来关闭线程池,并等待所有任务完成。正确地管理线程池的生命周期可以避免资源泄漏和线程阻塞的问题。
  5. 线程安全性:在自定义线程池时,需要考虑线程安全性。多个任务并发执行时,可能会涉及到共享资源的访问,需要使用合适的同步机制来保证线程安全。

总之,自定义线程池需要合理配置线程池的大小、选择适当的任务队列和拒绝策略,正确管理线程池的生命周期,并考虑线程安全性。这些注意事项可以帮助我们设计高效、可靠的线程池。

标签:Java,队列,创建,任务,线程,executor,new,ThreadPoolExecutor
From: https://blog.csdn.net/weixin_73330164/article/details/137166456

相关文章

  • Java面试必问题21:线程池核心参数
    publicThreadPoolExecutor(intcorePoolSize,                        intmaximumPoolSize,                        longkeepAliveTime,                        TimeUnitunit,        ......
  • 基于Java+Springboot框架自习室教室座位预约系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • Java static(1)
    类变量与类一起加载一次,在内存中保留一份,可以被类和所有的对象共享。实例变量实例变量属于对象,每个对象都有一份,只能被对象访问。publicclassTestStatic{publicstaticvoidmain(String[]args){Student1.name="张三";Student1student1......
  • java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc
    一、源码特点   JSP洗衣店管理系统是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。javaWeb洗衣店管理系统二、功能介绍(......
  • java Web 疫苗预约管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc
    一、源码特点   JSP疫苗预约管理系统是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。javaWeb疫苗预约管理系统二、功能介......
  • [附源码]JAVA计算机毕业设计大学生心灵氧吧(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展,大学生面临着日益严峻的学习、就业和人际关系等多重压力。这些压力往往导致大学生出现焦虑、抑郁等心理问题,严重影响其身心健康和......
  • [附源码]JAVA计算机毕业设计大学生就业管理系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,大学生就业问题一直是社会关注的焦点。随着高校扩招政策的实施,每年毕业的大学生数量逐年攀升,而就业市场的竞争也愈发激烈。传统的就业管理......
  • 【Java系列】 Web开发 | 基于jQuery的Ajax应用
    原创:清华计算机学堂基于jQuery的Ajax应用01、jQuery简介jQuery是一个免费、开源、兼容多浏览器的JavaScript库,其核心理念是:writeless,domore(写得更少,做得更多)。jQuery于2006年1月由美国人JohnResig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由DaveMe......
  • Springboot+vue的高校科研信息管理系统(有报告)。Javaee项目,springboot vue前后端分离项
    演示视频:Springboot+vue的高校科研信息管理系统(有报告)。Javaee项目,springbootvue前后端分离项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系......
  • 基于Springboot的研究生调研管理系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的研究生调研管理系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系......