广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java线程池合理设置最大线程数和核心线程数方式
  • 506
分享到

java线程池合理设置最大线程数和核心线程数方式

2024-04-02 19:04:59 506人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录线程池合理设置最大线程数和核心线程数一开始是这么配置的后来网上查询线程池核心数配置最后我是这么配置的线程池核心线程数与最大线程数的区别线程池策略饱和策略线程池合理设置最大线程数和

线程池合理设置最大线程数和核心线程数

工作中有这样一个场景,需要处理千万级别的数据的一个算法,大部分是增删查的操作。这个时候就需要使用多线程去处理。

一开始是这么配置的


@Configuration
@EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解开启异步任务支持
@ComponentScan({"com.ctfojt.auditbcarsloGo.service"}) //必须加此注解扫描包
public class ThreadPoolConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(10);//核心线程大小
        taskExecutor.setMaxPoolSize(20);//最大线程大小
        taskExecutor.setQueueCapacity(500);//队列最大容量
        //当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(10);
        taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");
        taskExecutor.initialize();
        return taskExecutor;
    }
}

这样配置效率很低,一天大概能处理30多万的数据。往后随着插入表的数据越来越多,处理速度也随之降低,跑个一两天之后,差不多能够处理10万多。完全满足不了需求。

后来网上查询线程池核心数配置

大部分都是这样的:

注:IO密集型(某大厂实践经验) 核心线程数 = CPU核数 / (1-阻塞系数)或着 CPU密集型:核心线程数 = CPU核数 + 1 IO密集型:核心线程数 = CPU核数 * 2

也尝试着这么配置,结果发现效率并不理想,提高不了多少。

最后我是这么配置的

结果效率大大提升,仅用不到一天的数据,就跑完了千万级的数据。


//获取当前机器的核数
public static final int cpuNum = Runtime.getRuntime().availableProcessors();
@Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(cpuNum);//核心线程大小
        taskExecutor.setMaxPoolSize(cpuNum * 2);//最大线程大小
        taskExecutor.setQueueCapacity(500);//队列最大容量
        //当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");
        taskExecutor.initialize();
        return taskExecutor;
    }

完美的解决了问题!

线程池核心线程数与最大线程数的区别

线程池策略

corePoolSize:核心线程数;maximunPoolSize:最大线程数

每当有新的任务到线程池时,

  • 第一步:先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若当前线程数量已达到corePoolSize,则进入下一步;
  • 第二步:判断工作队列(workQueue)是否已满,未满则将新的任务提交到工作队列中,满了则进入下一步;
  • 第三步:判断线程池中的线程数量是否达到了maxumunPoolSize,如果未达到,则新建一个工作线程来执行这个任务,如果达到了则使用饱和策略来处理这个任务。注意: 在线程池中的线程数量超过corePoolSize时,每当有线程的空闲时间超过了keepAliveTime,这个线程就会被终止。直到线程池中线程的数量不大于corePoolSize为止。

(由第三步可知,在一般情况下,Java线程池中会长期保持corePoolSize个线程。)

饱和策略

当工作队列满且线程个数达到maximunPoolSize后所采取的策略

  • AbortPolicy:默认策略;新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。
  • CallerRunsPolicy:既不抛弃任务也不抛出异常,使用调用者所在线程运行新的任务。
  • DiscardPolicy:丢弃新的任务,且不抛出异常。
  • DiscardOldestPolicy:调用poll方法丢弃工作队列队头的任务,然后尝试提交新任务
  • 自定义策略:根据用户需要定制。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java线程池合理设置最大线程数和核心线程数方式

本文链接: https://www.lsjlt.com/news/161090.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java线程池合理设置最大线程数和核心线程数方式
    目录线程池合理设置最大线程数和核心线程数一开始是这么配置的后来网上查询线程池核心数配置最后我是这么配置的线程池核心线程数与最大线程数的区别线程池策略饱和策略线程池合理设置最大线程数和...
    99+
    2022-11-12
  • java线程池如何合理设置最大线程数和核心线程数
    这篇文章将为大家详细讲解有关java线程池如何合理设置最大线程数和核心线程数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。线程池合理设置最大线程数和核心线程数工作中有这样一个场景,需要处理千万级别的数据的...
    99+
    2023-06-22
  • 浅谈Java线程池的7大核心参数
    目录前言一、线程池的创建及重要参数二、ThreadPoolExecutor中重要的几个参数详解三、workQueue队列(阻塞队列)四、常见的几种自动创建线程池方式五、线程池实现线程...
    99+
    2022-11-12
  • 并发编程系列---【线程池七大核心参数】
    一、七大核心参数 corePoolSize                            核心线程数 maximumPoolSize                   最大线程池参数 keepAliveTime       ...
    99+
    2023-09-03
    java jvm 开发语言
  • Java线程池中的各个参数如何合理设置
    一、前言 在开发过程中,好多场景要用到线程池。每次都是自己根据业务场景来设置线程池中的各个参数。 这两天又有需求碰到了,索性总结一下方便以后再遇到可以直接看着用。 虽说根据业务场景来...
    99+
    2022-11-12
  • Java线程池大小的设置方法实例
    目录Java 中线程池创建的几种方式🐱‍🏍Executors 工厂方法创建👏 new ThreadPoolExe...
    99+
    2022-11-12
  • Java线程数究竟设多少合理
    目录需求缘起一些共性认知常见服务线程模型1. IO线程与工作线程通过队列解耦类模型2. 纯异步线程模型工作线程的工作模式量化分析并合理设置工作线程数结论经验需求缘起 Web-Serv...
    99+
    2022-11-12
  • 在程序开发中线程数量如何设置才最合理
    这篇文章主要介绍在程序开发中线程数量如何设置才最合理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 那么现在有个问题来了,在应用中,针对多线程开发,线程数量我们要怎么设置才...
    99+
    2022-10-19
  • Springboot线程池并发处理数据优化方式
    目录第一步:首先配置线程基本参数第二步:让Spring Boot加载第三步:创建一个service接口第四步:编写现实类第五步:测试结果如下第一步:首先配置线程基本参数 可以放在ap...
    99+
    2022-11-12
  • python线程池ThreadPoolExecutor,传单个参数和多个参数方式
    目录python线程池ThreadPoolExecutor,传单个参数和多个参数这是线程池传单个参数的下面是传多个参数的python线程池传入多个参数 ThreadPoolExecu...
    99+
    2023-03-14
    python线程池 python ThreadPoolExecutor python传单个参数 python传多个参数
  • 如何优化Springboot线程池并发处理数据方式
    这篇文章给大家分享的是有关如何优化Springboot线程池并发处理数据方式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一步:首先配置线程基本参数可以放在application.propertes文件种也可以...
    99+
    2023-06-22
  • Java多线程之 FutureTask:带有返回值的函数定义和调用方式
    FutureTask 返回值的函数定义和调用 使用Runnable接口定义的任务是没有返回值的。很多时候,我们是有返回值的,为了解决这个问题,Java提供了Callable接口,可以...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作