企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》
【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这 样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1) FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 2) CachedThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。 |
- 创建线程池方式一:new ThreadPoolExecutor 方式
- ExecutorService executorService = new ThreadPoolExecutor(3,5,10, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
- for (int i = 0; i < 9; i++) {
- executorService.execute(()->{
- System.out.println(Thread.currentThread().getName() + "开始办理业务了。。。。。。");
- });
- }
- 创建线程池方式二:spring的ThreadPoolTaskExecutor方式
- @Configuration
- public class ExecturConfig {
- @Bean("taskExector")
- public Executor taskExector() {
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setCorePoolSize(3);//核心池大小
- executor.setMaxPoolSize(5);//最大线程数
- executor.setQueueCapacity(3);//队列长度
- executor.setKeepAliveSeconds(10);//线程空闲时间
- executor.setThreadNamePrefix("tsak-asyn");//线程前缀名称
- executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//配置拒绝策略
- return executor;
- }
- }
创建线程池的注意事项:
- 线程池的大小:线程池的大小应根据任务的类型和系统资源进行合理的配置。如果线程池的大小过小,可能会导致任务排队等待执行,影响系统的响应性能;如果线程池的大小过大,可能会占用过多的系统资源,导致系统负载过重。可以通过监控和调整线程池的大小来优化性能。
- 任务队列的选择:线程池通常会使用一个任务队列来保存待执行的任务。任务队列的选择应根据任务的特性进行合理的选择。如果任务较多且执行时间较短,可以选择无界队列(如LinkedBlockingQueue);如果任务较少且执行时间较长,可以选择有界队列(如ArrayBlockingQueue)或者优先级队列(如PriorityBlockingQueue)。
- 线程池的拒绝策略:当任务无法被线程池接收执行时,需要定义适当的拒绝策略。常见的拒绝策略有:抛出异常(AbortPolicy)、丢弃任务(DiscardPolicy)、丢弃最早的任务(DiscardOldestPolicy)和调用者运行任务(CallerRunsPolicy)。根据业务需求选择合适的拒绝策略。
- 线程池的生命周期管理:线程池的生命周期包括初始化、执行任务和关闭。在初始化时,需要设置线程池的参数;在执行任务时,需要提交任务到线程池;在关闭时,需要调用线程池的shutdown()或shutdownNow()方法来关闭线程池,并等待所有任务完成。正确地管理线程池的生命周期可以避免资源泄漏和线程阻塞的问题。
- 线程安全性:在自定义线程池时,需要考虑线程安全性。多个任务并发执行时,可能会涉及到共享资源的访问,需要使用合适的同步机制来保证线程安全。
总之,自定义线程池需要合理配置线程池的大小、选择适当的任务队列和拒绝策略,正确管理线程池的生命周期,并考虑线程安全性。这些注意事项可以帮助我们设计高效、可靠的线程池。
标签:Java,队列,创建,任务,线程,executor,new,ThreadPoolExecutor From: https://blog.csdn.net/weixin_73330164/article/details/137166456