springBoot中的异步编程—@Async

1.启动类加上@EnableAsync

2.在方法上加上@Async

3.注意对static方法修饰无效!

4.调用与被修饰方法不能写在同一个函数中。

5.调用者和被调用者不能在同一个类中,否则不生效。

6.返回值只能为Future或者Void, Future的使用方式.

@Async
public Future<String> asyncMethod() {
  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
  System.out.println("StartTime - " + Thread.currentThread().getName() + df.format(new Date()));
  try {
    Thread.sleep(1000);
  } catch (Exception e) {
    e.printStackTrace();
  }
  System.out.println("EndTime - " + Thread.currentThread().getName() + df.format(new Date()));
  return new AsyncResult<String>("hello world!");
}

@Test
public void contextLoads() {
  Future<String> result1 = test.asyncMethod();
  Future<String> result2 = test.asyncMethod();
  Future<String> result3 = test.asyncMethod();
  while (!result1.isDone() || !result2.isDone() || !result3.isDone()) {
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

5.自定义线程池

@Configuration
public class TaskConfiguration {
  @Bean("taskExecutor")
  public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10); // 线程池创建时候初始化的线程数
    executor.setMaxPoolSize(20); // 线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程
    executor.setQueueCapacity(200); // 缓冲任务队列的大小
    executor.setKeepAliveSeconds(60); // 允许线程的空闲时间,超过会被销毁
    executor.setThreadNamePrefix("custom-prefix-");// 线程的前缀
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 对拒绝任务的处理策略

    return executor;
  }
}

定义之后在Async中指定 @Async("taskExecutor")

注意“:由于在应用关闭的时候异步任务还在执行,导致类似 数据库连接池 这样的对象一并被 销毁了,当 异步任务 中对 数据库 进行操作就会出错。

setWaitForTasksToCompleteOnShutdown(true): 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,这样这些 异步任务销毁 就会先于 数据库连接池对象 的销毁。 setAwaitTerminationSeconds(60): 该方法用来设置线程池中 任务的等待时间,如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值