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); }
方式四:
学海无涯 代码作伴