springboot异步的两种方法

1.使用springboot自带的异步

1. 在启动类中开启异步

    加上注解:

    @EnableAsync

2. 异步的类上需要加@Component,如果这个类是异步的话需要在类上加@Async

     如果某个方法是则只需要在方法上加上注解

3.注意点:

  1)要把异步任务封装到类里面,不能直接写到Controller
  2)增加Future<String> 返回结果 AsyncResult<String>("task执行完成");
  3)如果需要拿到结果 需要判断全部的 task.isDone()
  4) @Async使用,必须是public方法 必须是非static方法,如果返回报错则是环绕增强的问题,需要返回对象,如Object

2.使用线程池异步

1. ThreadPoolUtils 工具类

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolUtils {
    private static volatile ThreadPoolExecutor pool = null;

    public static ThreadPoolExecutor getThreadPool() {
        if (pool == null) {
            synchronized (ThreadPoolUtils.class) {
                if (pool == null) {
                    pool = createPool(10, 100);
                }
            }
        }
        return pool;
    }

    /**
     * 创建线程池
     *
     * @param corePoolSize  核心线程数量
     * @param maxThreadSize 最大线程数
     * @return
     */
    private static ThreadPoolExecutor createPool(int corePoolSize, int maxThreadSize) {
        return new ThreadPoolExecutor(corePoolSize, maxThreadSize, 0,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    }
}
View Code

2. 使用线程池创建线程

ThreadPoolExecutor threadPool = ThreadPoolUtils.getThreadPool();
threadPool.submit(new Callable<Boolean>() {
  @Override
   public Boolean call() throws Exception {
      return sendEmail("保险产品审核表",emails,"未审核的产品",is);
      }
   });
View Code

3. threadPool.submit()是可以获取返回结果的,call方法里返回的数据,

4. Feature feature = submit.get()

submit.get方法是一个阻塞方法,如果开启的线程内的逻辑没有处理完成,它会等开启的线程处理完成。
submit.get(10, TimeUnit.SECONDS)//设置线程的超时时间。
posted @ 2020-01-06 13:39  这都没什么  阅读(2663)  评论(0编辑  收藏  举报