SpringBoot集成线程池

使用线程池的好处:
  • 降低资源消耗

:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

  • 提高响应速度

:当任务到达时,可以不需要等待线程创建就能立即执行。

  • 提高线程的可管理性

:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。

配置及调用:
1、创建配置类
@EnableAsync
//配置类
@Configuration
public class ThreadPoolsConfig {
@Bean("AiTaskExecutor")
    public Executor visible() {
        ThreadPoolTaskExecutor executor = new VisibleThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(500);//maxPoolSize * 1000
        executor.setThreadNamePrefix("aiThread");
        executor.setThreadPriority(Thread.MAX_PRIORITY);
        //设置线程池关闭的时候 等待所有的任务完成后再继续销毁其他的bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
 }
2、创建线程打印类,用于跟踪线程使用情况
package com.cmes.ghg.ai.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author: lizj
 * @CreateTime: 2023-05-30  16:38
 * @Description: TODO
 */
public class VisibleThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
    private static final Logger log = LoggerFactory.getLogger(VisibleThreadPoolTaskExecutor.class);
    //2、编写打印线程池方法
    private void log(String method){
        ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();

        if(threadPoolExecutor==null){
            return;
        }

        log.info("线程池:{}, 执行方法:{}, 完成任务数量 [{}], 活跃线程数 [{}], 队列长度 [{}]",
                this.getThreadNamePrefix(),
                method,
                threadPoolExecutor.getTaskCount(),
                threadPoolExecutor.getCompletedTaskCount(),
                threadPoolExecutor.getActiveCount(),
                threadPoolExecutor.getQueue().size());
    }



    //3、重写方法,进行日志的记录
    @Override
    public void execute(Runnable task) {
        log("execute");
        super.execute(task);
    }

    @Override
    public void execute(Runnable task, long startTimeout) {
        log("execute");
        super.execute(task, startTimeout);
    }

    @Override
    public Future<?> submit(Runnable task) {
        log("submit");
        return super.submit(task);
    }

    @Override
    public <T> Future<T> submit(Callable<T> task) {
        log("InitPortThread");
        return super.submit(task);
    }

    @Override
    public ListenableFuture<?> submitListenable(Runnable task) {
        log("submitListenable");
        return super.submitListenable(task);
    }

    @Override
    public <T> ListenableFuture<T> submitListenable(Callable<T> task) {
        log("submitListenable");
        return super.submitListenable(task);
    }
}
3、通过注解调用异步线程池使用;
@Override
@Async("AiTaskExecutor")
public void AisDataCal(String startTime,String endTime,String jobId,String jobFinishTime) throws Exception {
    ...省略业务代码实现
    }
4、如果线程核心方法需要循环调用或需要创建多个异步线程,需要再创建一个接口调用,如果不需要则直接通过控制层调用
@Service
public class InitThreadPoolImpl implements InitThreadPool {
    @Autowired
    //线程核心方法接口
    ICalProxyService calProxyService;
    @Override
    public boolean CalAisDataByShipInfo() throws Exception {
        List<Map<String, String>> shipMaps = ClickHouseConfig.exeSelectSql(GlobalVariables.shipSql);
        List<List<Map<String, String>>> shipListSplit = Lists.partition(shipMaps, 80);
        for (List<Map<String, String>> maps : shipListSplit) {
            calProxyService.AisDataCal(shipMaps, "", "", "", "");
        }
        return false;
    }
}
5、调用返回示例

6、接收返回信息时,使用CompletableFuture进行接收
@Async("AiTaskExecutor")
public CompletableFuture<Map> ExportListAssessment(Map map) throws Exception {
    map.put("isExportFlag","1");
    Map assessment = this.getAssessment(map);
    return CompletableFuture.completedFuture(assessment);
}
7、Controller层接收
@RequestMapping(value = "/exportListAssessment",method = RequestMethod.POST)
@ApiOperation("社会船评估列表导出")
public ResultData<Map<String,Object>> exportListAssessment(@RequestBody Map paramMap) throws Exception {
    CompletableFuture<Map> mapCompletableFuture = emissionsAssessment.ExportListAssessment(paramMap);
    Map map = mapCompletableFuture.get();
    return ResultData.success(map);
}

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了对线程池集成和支持,可以方便地使用线程池来处理并发任务。下面是使用Spring Boot线程池的基本步骤: 1. 导入依赖:在pom.xml文件中添加Spring Boot线程池的依赖。例如,对于基于Java的应用,可以添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-async</artifactId> </dependency> ``` 2. 配置线程池:在Spring Boot的配置文件(如application.properties或application.yml)中配置线程池的相关属性。例如,可以配置线程池的核心线程数、最大线程数、队列容量等。以下是一个示例配置: ```properties # 线程池配置 spring.task.execution.pool.core-size=10 spring.task.execution.pool.max-size=20 spring.task.execution.pool.queue-capacity=100 ``` 3. 创建异步方法:在Spring Boot应用中创建一个需要异步执行的方法,并使用`@Async`注解标记该方法。例如: ```java @Service public class MyService { @Async public CompletableFuture<String> asyncMethod() { // 异步执行的方法逻辑 return CompletableFuture.completedFuture("异步方法执行完成"); } } ``` 4. 调用异步方法:在需要调用异步方法的地方,直接调用即可。Spring Boot会自动将方法转化为异步执行。例如: ```java @RestController public class MyController { @Autowired private MyService myService; @GetMapping("/async") public String executeAsyncMethod() { CompletableFuture<String> futureResult = myService.asyncMethod(); // 异步方法返回的是一个CompletableFuture对象,可以通过该对象获取异步方法的执行结果 return "异步方法已启动"; } } ``` 这样,通过以上步骤,你就可以在Spring Boot中使用线程池来处理并发任务了。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值