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 @ 2021-10-27 18:29  威兰达  阅读(879)  评论(0编辑  收藏  举报