赞
踩
关于线程池的使用:
Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):
Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:
Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例_threadpoolexecutor创建线程-CSDN博客
项目开发中多使用SpringBoot,Spring中有个自带的线程池ThreadPoolTaskExecutor
Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor
ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC。
ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。
ThreadPoolTaskExecutor这个类则是spring包下的,是spring为我们提供的线程池类。
SpringBoot默认情况下帮我们自动配置了ThreadPoolTaskExecutor到IOC容器中,我们需要的时候直接注入使用即可。
如果我们不想要SpringBoot帮我们默认配置的线程池参数,我们可以自行配置,ThreadPoolTaskExecutor支持对线程池核心参数的重新配置。
注:
1、以若依项目为例
若依前后端分离版手把手教你本地搭建环境并运行项目:
若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客
ruoyi中对Spring默认的线程池参数进行配置,配置文件位置
配置文件内容
- package com.ruoyi.framework.config;
-
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.ScheduledThreadPoolExecutor;
- import java.util.concurrent.ThreadPoolExecutor;
- import org.apache.commons.lang3.concurrent.BasicThreadFactory;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
- import com.ruoyi.common.utils.Threads;
-
- /**
- * 线程池配置
- *
- * @author ruoyi
- **/
- @Configuration
- public class ThreadPoolConfig
- {
- // 核心线程池大小
- private int corePoolSize = 50;
-
- // 最大可创建的线程数
- private int maxPoolSize = 200;
-
- // 队列最大长度
- private int queueCapacity = 1000;
-
- // 线程池维护线程所允许的空闲时间
- private int keepAliveSeconds = 300;
-
- @Bean(name = "threadPoolTaskExecutor")
- public ThreadPoolTaskExecutor threadPoolTaskExecutor()
- {
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setMaxPoolSize(maxPoolSize);
- executor.setCorePoolSize(corePoolSize);
- executor.setQueueCapacity(queueCapacity);
- executor.setKeepAliveSeconds(keepAliveSeconds);
- // 线程池对拒绝任务(无线程可用)的处理策略
- executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
- return executor;
- }
- }
2、Java中使用CompletableFuture实现异步任务
Java8中CompletableFuture实现异步任务编排以及示例:
Java8中CompletableFuture实现异步任务编排以及示例_java并发 completablefuture异步编程的实现-CSDN博客
3、在需要使用线程池的地方直接注入
- @Autowired
- private ThreadPoolTaskExecutor threadPoolTaskExecutor;
4、线程池的使用
编写单元测试并统计耗时
- @Test
- public void test2() {
- StopWatch stopWatch = new StopWatch();
- stopWatch.start();
- for (int i = 0; i < 5; i++) {
- int finalI = i;
- CompletableFuture.runAsync(() -> {
- System.out.println(finalI + "执行异步操作。。。");
- int result = 0;
- for (int j = 0; j < 1000000; j++) {
- result += j;
- }
- System.out.println("计算结果:"+result);
- }, threadPoolTaskExecutor);
- }
- stopWatch.stop();
- System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
- }
运行结果
为形成对比,编写以下测试
- @Test
- public void test1() {
- StopWatch stopWatch = new StopWatch();
- stopWatch.start();
- for (int i = 0; i < 5; i++) {
- int result = 0;
- for (int j = 0; j < 1000000; j++) {
- result += j;
- }
- System.out.println("计算结果:"+result);
- }
- stopWatch.stop();
- System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
- }
运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。