springboot线程池的使用方式2

一、简单介绍

方式1:Executors.newCachedThreadPool线程池。Executors有7种不同的线程池。

复制代码
private static final ExecutorService executorService = Executors.newCachedThreadPool(new BasicThreadFactory.Builder()
            .namingPattern("create-card-thread-%d")
            .build());

CompletableFuture.runAsync(createCards(reqVO, buId), executorService)
        .whenComplete((Void v, Throwable t) -> {
            if (t == null) {
                log.info("create card complete.batchId={}", reqVO.getBatchId());
            } else {
                log.error("create card failed.batchId={}", reqVO.getBatchId(), t);
            }
            try (ShardingCtx s = ShardingCtx.setShardingValue(buId)) {
                CustomerIntGencardLogPO updateLog = new CustomerIntGencardLogPO();
                updateLog.setPk(gencardLogPO.getPk())
                        .setLastUpdated(LocalDateUtil.localDateTimeMinus8Hours(LocalDateTime.now()))
                        .setGencardStatus(PROCESSED);
                customerIntGencardLogMapper.updateById(updateLog);
            }
        });
复制代码

方式二:自定义线程池

注入:@Autowire   @Resource

复制代码
@Service
public class AsyncService {

    @Autowired //1.注入自定义的线程池 Resource 重命名
    @Resource(description = "taskExecutorTest")
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    //自定义线程池
    private static final ThreadPoolExecutor taskExecutor =
        new ThreadPoolExecutor(10, 20, 20, TimeUnit.SECONDS,
            new LinkedBlockingDeque<Runnable>(20), new ThreadPoolExecutor.CallerRunsPolicy());

    public void addEventLog(String buId, String status) {
        CustomerEventLogPO customerEventLog = new CustomerEventLogPO();
        customerEventLog.setStatus(status);
        customerEventLog.setCreated(LocalDateTime.now());
        customerEventLogMapper.insert(customerEventLog);

        //submit有返回值, jdk8新写法
        threadPoolTaskExecutor.submit(new Thread(() -> {
            customerEventLogMapper.insert(customerEventLog);
        }));

        //execute无返回值   
        threadPoolTaskExecutor.execute(new Thread(() -> {
            customerEventLogMapper.insert(customerEventLog);
        }));

        //老的写法
        taskExecutor.execute(new Runnable() {
            @Override public void run() {
                try {
                    studentscount = coursesService.getStudentCount(pd);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
复制代码

方式三:

springboot自带的异步线程池,在要异步的方法上直接加注解: 

@Async("taskExecutor")  taskExecutor是自定义的bean或者默认的。

复制代码
    @Async("taskExecutor")
    @DynamicDatasource
    public void addEventLog(String buId, String uuid, String evenType, String eventData, Exception e, String status){
        CustomerEventLogPO customerEventLog = new CustomerEventLogPO();
        customerEventLog.setUuid(uuid);
        customerEventLog.setEventType(evenType);
        customerEventLog.setEventData(eventData);
        customerEventLog.setStatus(status);
        customerEventLog.setDescripe(e != null ? e.getMessage() : "");
        customerEventLog.setCreated(LocalDateTime.now());
        customerEventLogMapper.insert(customerEventLog);
    }
复制代码

方式四:

 

posted @   威兰达  阅读(885)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示