springboot线程池配置(SpringBoot使用线程池)
本文目录
SpringBoot使用线程池
线程池是一种线程使用模式。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。 使用线程池,有几点好处: Java开发,我们使用JDK环境,开发框架基本都是Spring全家桶。线程池的基础原理都在JDK中,JDK1.5新增线程池相关类,在核心jar包 rt.jar 中, java.util.concurrent 下面。 看一下jdk中线程池继承关系类图:JDK中,使用 ThreadPoolExecutor 给创建了几个不同功能种类的线程池,可以调出来看看: 看一下都有什么特点: 从上面可以看出他们各有各的特点,但是阿里巴巴开发守则却不推荐使用以上线程池,因为它们可能会对服务资源的浪费,所以推荐使用通过ThreadPoolExecutor自定线程池。 Spring中将Java中的线程池进行了封装,而且提供了默认实现,也能自定义线程池,我一般都用Spring中的线程池包。 Spring中的线程池和JDK中的基本一样,在 org.springframework.scheduling.concurrent 包下面。 和JDK中对应的,Spring的顶层接口是 TaskExecutor ,它实现了JDK中的 Executor 接口。 Spring中常用的线程池是 ThreadPoolTaskExecutor ,它是是借助于JDK并发包中的 java.util.concurrent.ThreadPoolExecutor 来实现的。 要想使用线程池,先了解一下线程池中的一些参数: 因为我们常用的是 ThreadPoolExecutor 线程池,所以去这个类中找。上面配置了线程池,并生成了线程池bean,交给了Spring容器管理,使用时注入即可使用。 SpringBoot线程池自动装配在 spring-boot-autoconfigure 这个jar中,在 org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration 类中。 自动装配条件:当往线程池中提交新任务时,线程池主要流程如下: 核心线程数 -》 线程队列 -》 最大线程数 -》 拒绝策略 所以使用线程池,需要注意:
springboot是单进程吗
是。springboot使用过程中 我们经常会使用到定时任务这个注解应该会很熟悉//定时任务1(2s执行一次)@Scheduled(cron = "0/2 * * * * ? ")@Componentpublic class StaticScheduleTask { //定时任务1(2s执行一次)@Scheduled(cron = "0/2 * * * * ? ")public void scheDuleTask() {System.out.println("test"+Thread.currentThread());} //定时任务2(5s执行一次)@Scheduled(cron = "0/5 * * * * ? ")public void scheDuleTask2() {System.out.println("test2"+Thread.currentThread());}}我们可以用这个定时的任务做我们自己的逻辑 比如定时的更新本地的内存缓存但是这样做有一个问题 当定时任务的类中有很多定时任务的方法时 这样做会有问题,假如一个任务执行的时间特别长,那么其他的任务就会被阻塞造成不能及时的执行。而定时任务默认为单线程的,我们可以用多条线程取执行多个任务设置线程池 (注意启动类上要加@EnableScheduling)@Configurationpublic class ScheduledConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5)); }}关于这个定时任务有很多实现方式 ,我只说最简单的这一中
springboot中如何使用线程池及异步线程
有一些业务需求,需要是异步进行的,不能影响当前线程的运行,在spring boot中则能通过注解和配置快速实现这个。首先写个异步线程池配置类,如下:@Configuration@EnableAsyncpublic class AsyncConfig {@Value("${async.executor.thread.core_pool_size}") private int corePoolSize; @Value("${async.executor.thread.max_pool_size}") private int maxPoolSize; @Value("${async.executor.thread.queue_capacity}") private int queueCapacity; private String threadNamePrefix = "AsyncExecutorThread-"; @Bean(name = "asyncExecutor") public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setThreadNamePrefix(threadNamePrefix);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize(); return executor;}}1234567891011121314151617181920212223242526272829然后将需要异步执行的业务步骤写成方法用@sync注解即可,如下:@Componentpublic class AsyncExecutorCommon {@Async("asyncExecutor") public void loadPic(IfcTingshenJzml tsJzml,WsTingshenJzmlService wsTingshenJzmlService) {List《IfcTingshenJzml》 tsJzmls = new ArrayList《IfcTingshenJzml》();tsJzmls.add(tsJzml);wsTingshenJzmlService.docService(tsJzmls);}}12345678910在业务代码里直接调用这个方法即可,这个方法的执行就是异步的。注意,异步方法和调用异步的方法不能写在一个类里,否则会报循环依赖异常,建议另建一个类,只用来放异步方法。
怎么用springboot配置线程池callable
使用应用服务器的连接池,效率较高,而且不需要在代码中出现数据库信息。 使用spring管理连接池的话,与服务器无关,便于移植。
更多文章:
ⅴⅰVo,x23,8G十128G内存手机,国内进价多少钱一台?淘宝聚划算5月份有什么优惠活动及超值的东西适合购买
2023年10月26日 23:00
minecraft正版下载免费(我的世界在哪可以下载电脑版)
2024年6月23日 00:04
熊猫烧香病毒下载(熊猫烧香的病毒用什么软件查杀啊,求救!!)
2024年3月9日 08:40
魔域的官方怎么老是说您的登录城市与本次不符?哪个高手知道哪里下载QQ魔域客户端,哪个是最新版本的我下了一个怎么进不去啊
2023年9月1日 18:20
我要下载电影(我要下载amv格式的电影或动画片 给我一个amv格式电影下载的网址,不要注册的,要免费的)
2024年7月14日 23:42
popstar电脑版(有一个单机游戏,点同一种颜色的方块就会消除,里面的方块就分别会说Red together)
2023年9月20日 17:00
云之遥是轩辕剑系列吗古三是什么幻三又是什么(具体题目)?云之遥攻略 云之遥攻略简述
2024年6月24日 21:26
植物大战僵尸怎么过关 植物大战僵尸植物僵尸怎么过?植物大战僵尸2无尽怎么防止僵王打植物
2024年6月24日 09:20