SpringBoot中使用多线程ThreadPoolTaskExecutor+CompletableFuture

news/2024/11/2 16:09:32/

SpringBoot中使用多线程ThreadPoolTaskExecutor+CompletableFuture

定义一个线程池,并将其注入为bean

我使用的是spring提供的线程池,所以不需要写关闭的逻辑

java">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
@EnableAsync
public class ExecutorConfig {@Bean(name = {"saveExecutor"})public Executor taskExecutor() {ThreadPoolTaskExecutor executor =  new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);//核心线程数executor.setMaxPoolSize(1000);// 最大线程数executor.setQueueCapacity(500);// 任务队列容量executor.setThreadNamePrefix("taskExecutor-");executor.initialize(); //初始化线程池return executor;}
}

使用

java">import cn.hutool.core.collection.ListUtil;
import com.train.demo.entities.User;
import com.train.demo.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;@Service
@Slf4j
public class UserService {private final UserRepository userRepository;private final Executor saveExecutor;@Autowiredpublic UserService(UserRepository userRepository,// 依赖注入,一定要使用@Qualifier指定bean名称,不然有问题@Qualifier("saveExecutor") Executor saveExecutor) {this.userRepository = userRepository;this.saveExecutor = saveExecutor;}public boolean addAllUsers() {// 定义一个数组,并生成1000000条数据ArrayList<User> users = new ArrayList<User>(){{for (int i = 0; i < 1000000; i++) {add(new User(null,"user"+i,2,"男"));}}};int count = 0;// 定义一个接收“CompletableFuture返回”的listList<CompletableFuture<Integer>> futureList = new ArrayList<>();while( count < users.size() ){// 这里只是计算剩下的数据量够不够1000,结果作为截取list的参数int size = users.subList( count, users.size()-1).size() > 9999 ? 9999: users.subList( count, users.size()-1).size();// 调用异步方法CompletableFuture<Integer> future = addAllUsersImpl(users.subList(count, count += size));futureList.add(future);count++;}futureList.forEach(CompletableFuture::join);//阻塞所有的异步方法全执行完毕再向下执行return true;}@Asyncprotected CompletableFuture<Integer> addAllUsersImpl(List<User> users) {// 此处使用spring线程池作为CompletableFuture线程池参数,并且异步执行return CompletableFuture.supplyAsync(() -> {log.info("save users thread[{}]", Thread.currentThread().getName());List<User> list = ListUtil.list(false, userRepository.saveAll(users));// 存储到数据库return list.size();// 返回存储的数据量}, saveExecutor);}
}

本地mysql实测,99.9万条数据,耗时27s


http://www.ppmy.cn/news/1543907.html

相关文章

齐次线性微分方程的解的性质与结构

内容来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 齐次线性微分方程定义 d n x d t n a 1 ( t ) d n − 1 x d t n − 1 ⋯ a n − 1 ( t ) d x d t a n ( t ) x 0 \frac{\mathrm{d}^nx}{\mathrm{d}t^n} a_1(t)\frac{\mathrm{d}^{n-1}x}{\math…

第16课 核心函数(方法)

掌握常用的内置函数及其用法。 数学类函数&#xff1a;abs、divmod、max、min、pow、round、sum。 类型转换函数&#xff1a;bool、int、float、str、ord、chr、bin、hex、tuple、list、dict、set、enumerate、range、object。 序列操作函数&#xff1a;all、any、filter、m…

同WiFi网络情况下,多个手机怎么实现不同城市的IP

在同一个WiFi网络下&#xff0c;所有设备通常都会共享同一个公网IP地址&#xff0c;因为它们连接到的是同一个路由器。要使多个手机显示为不同城市的IP地址&#xff0c;你需要使用以下方法&#xff1a; 更改网络设置 在手机的设置中&#xff0c;可以找到“无线和网络”或“网…

Chromium 中chrome.fontSettings扩展接口定义c++

一、chrome.fontSettings 使用 chrome.fontSettings API 管理 Chrome 的字体设置。 权限 fontSettings 要使用 Font Settings API&#xff0c;您必须在扩展程序中声明 "fontSettings" 权限 清单。例如&#xff1a; {"name": "My Font Settings E…

.NET Core WebApi第7讲:项目的发布与部署

一、理解 前端跟后端拿数据&#xff0c;然后在前端页面中展示&#xff0c;就是我们要完成的事情。 把前端跟后端开发好之后&#xff0c;我们需要落地部署&#xff0c;这个时候就需要一个服务器。 服务器就是一台电脑&#xff0c;只要windows里面有一个叫IIS的管理器。 二、项目…

基于 Python 的 Django 框架开发的电影推荐系统

项目简介&#xff1a;本项目是基于 Python 的 Django 框架开发的电影推荐系统&#xff0c;主要功能包括&#xff1a; 电影信息爬取&#xff1a;获取并更新电影数据。数据展示&#xff1a;提供电影数据的列表展示。推荐系统&#xff1a;基于协同过滤算法实现个性化推荐。用户系…

【Matlab】基础操作汇总

一、函数 1、定积分/不定积分函数&#xff1a;int int(f&#xff0c;[r&#xff0c;[x0&#xff0c;[x1]]]) f&#xff1a;所要积分的表达式&#xff1b; r&#xff1a;积分变量 若为定积分&#xff0c;则x0与x1为积分上下限。 2、求解非刚性微分方程&#xff1a;ode45 [t,y…

ctfshow文件包含web78~81

目录 web78 方法一&#xff1a;filter伪协议 方法二&#xff1a;input协议 方法三&#xff1a;data协议 web79 方法一:input协议 方法二&#xff1a;data协议 web80 方法一&#xff1a;input协议 方法二&#xff1a;日志包含getshell web81 web78 if(isset($_GET[file]…