当数据处理过大,无法在页面失去连接之前返回页面,就容易出现连接超时的情况
@Async简单使用
在springBoot的启动类添加注解
@EnableAsync
之后在需要使用异步的方法上使用@Async
注解
ps: 异步的调用不能在同一个类中,必须在一个类中的方法去访问另一个类中加了@Async注解的方法
给@Async添加自定义线程池
在springBoot的启动类添加一个线程池如:
@Bean("taskExecutor")
public ExecutorService Ex(){
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
return new ThreadPoolExecutor(5,20,200L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory);
}
之后就可以@Async("taskExecutor")
使用自定义的线程池跑异步
线程池简单使用
这个线程池也可以通过注入的方式在方法中使用
private final ExecutorService executorService;
public TicketsServiceImpl( ExecutorService executorService) {
this.executorService = executorService;
}
如:
executorService.submit(() -> {
//需要运行的方法
});
//之后的代码,会与上面的线程同时执行
这种方式使用的话,主线程不会等待子线程执行完毕,之后再执行后面的代码,类似于开了异步;
第二种使用
第二种的话是带有返回值的线程,通过submit.get();
使主线程进入等待状态,只有等待子线程处理完毕之后执行,后面的方法,场景的适用于一个方法中可以同时处理两个业务,并且主线程需要等待前两条业务执行完毕之后,再执行下面的代码的情况
Future<Boolean> submit = executorService.submit(() -> {
//需要运行的方法
return true;
});
Future<Boolean> submit1 = executorService.submit(() -> {
//需要运行的方法
return true;
});
try {
submit.get();
submit1.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//之后的代码,会等待上面两个线程执行完毕之后再执行