我是靠谱客的博主 笑点低八宝粥,最近开发中收集的这篇文章主要介绍spring boot 异步多线程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.在启动类中加入注解@EnableAsync启用异步

@EnableAsync
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(TestApplication.class, args);
}
}

2.线程池配置类

@Slf4j
@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {//实现AsyncConfigurer接口
// ThredPoolTaskExcutor的处理流程
// 当池子大小小于corePoolSize,就新建线程,并处理请求
// 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
// 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
// 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
//实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池TaskExecutor
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(16);
taskExecutor.setMaxPoolSize(16);
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
log.error("AsyncUncaughtExceptionHandler 线程异常!!!!!!!!!!!!!!!");
return null;
}
}

3.编写任务类

@Service
// 线程执行任务类
public class AsyncTaskService {
Random random = new Random();
@Async
// 表明是异步方法
// 无返回值
public void executeAsyncTask(String msg) {
System.out.println(Thread.currentThread().getName()+"开启新线程执行" + msg);
}
/**
* 异常调用返回Future
*
* @param i
* @return
* @throws InterruptedException
*/
@Async
public Future<String> asyncInvokeReturnFuture(int i) throws InterruptedException {
System.out.println("input is " + i);
Thread.sleep(1000 * random.nextInt(i));
Future<String> future = new AsyncResult<String>("success:" + i);// Future接收返回值,这里是String类型,可以指明其他类型
return future;
}
}

4.调用任务类

@Component
public class Consumer1 {
@Resource
private AsyncTaskService asyncTaskService;
public void test(String msg){
System.out.println(Thread.currentThread().getName()+":"+msg);
asyncTaskService.executeAsyncTask(msg);
}
}

注意:任务类中的注解了@Async的方法调用类中其他的注解了@Async的方法是不会放到线程池中的。

最后

以上就是笑点低八宝粥为你收集整理的spring boot 异步多线程的全部内容,希望文章能够帮你解决spring boot 异步多线程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部