springboot @Async异步回调

1、在类上开启异步注解
springboot @Async异步回调_第1张图片
2、异步数据用 Future 接收,all.get()获取方法返回值(如果线程还没结束,会堵塞,等待线程结束)

springboot @Async异步回调_第2张图片无返回值时,需要等每个线程都结束才进行下一步操作可使用
也可与上面future.get()一起使用,先判断都结束了,在一起获取值
future.isDone(),结束时返回true

//间隔100毫秒轮询 直到 A B C 全部完成
        while (true) {
            if (taskA.isDone() && taskB.isDone() && taskC.isDone()) {
                break;
            }
            Thread.sleep(100);
        }

3、方法上加@Async注解,返回Future类型(注意@Async不能与方法同一个类里,否则会失效)

@Async方法最好放在一个新的类上,否则该类有循环依赖,会触发循环依赖问题

   @Override
   @Async
    public Future<Integer> listProjectListByAll(List<Integer> contactType, String multiLike, List<String> createBysysDeptIdList, Integer startDay, Integer endDay, String status) {
        String name = Thread.currentThread().getName();
        System.out.println("线程名字"+ name + "begin");
        Future<Integer> all = null;
        try {
            List<ProjectManage> projectManageList = baseMapper.listProjectList(contactType, multiLike, createBysysDeptIdList, startDay, endDay, status);
            all = new AsyncResult<Integer>(projectManageList.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("线程名字"+ name + "end");
        return all;
    }

1、用异步方法耗时 2s
springboot @Async异步回调_第3张图片

2、同步方法耗时 6s
springboot @Async异步回调_第4张图片

4、自定义线程池

不自定义线程池,spring会使用默认线程池

/**
 * 线程池配置
 * @author 
 *
 */
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
 
/** 
 * 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
 * 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
 * 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝 
 */
 
    /** 核心线程数(默认线程数) */
    private static final int corePoolSize = 20;
    /** 最大线程数 */
    private static final int maxPoolSize = 100;
    /** 允许线程空闲时间(单位:默认为秒) */
    private static final int keepAliveTime = 10;
    /** 缓冲队列大小 */
    private static final int queueCapacity = 200;
    /** 线程池名前缀 */
    private static final String threadNamePrefix = "Async-Service-";
 
    @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
    public ThreadPoolTaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize); 
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveTime);
        executor.setThreadNamePrefix(threadNamePrefix);
 
        // 线程池对拒绝任务的处理策略
        // CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化
        executor.initialize();
        return executor;
    }
}

使用:在注解上指定即可@Async("taskExecutor")

默认线程池配置

@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor。
默认核心线程数:8,
最大线程数:Integet.MAX_VALUE,
队列使用LinkedBlockingQueue,
容量是:Integet.MAX_VALUE,
空闲线程保留时间:60s,
线程池拒绝策略:AbortPolicy。

你可能感兴趣的:(spring,boot,前端,spring,boot,数据库)