Java异步线程中的CompletableFuture与@Async详解
作者:景庆197
引言
1.CompletableFuture是java中提供的一个异步执行类,@Async是Spring提供的异步执行方法,当调用方法单独开启一个线程进行调用。
2.@Async通常指定一个方法使用的异步方法调用,而CompletableFuture可以一个方法体内对请求体进行排序组合成链式调用再返回
1.@Async的使用
@Async的粒度比较大,在使用的时候只能添加到方法上,并且需要自定义线程池。
实现:
需要在配置类上添加@Configuration
需要实现AsyncConfigure接口,里面有两个方法可以重写[getAsyncExecutor,getAsyncUncaughtExceptionHandler],主要实现的方法是getAsyncExecutor(),
我们当时实现手动注入一个@Bean。
ps:ThreadPoolTaskExecutor设计模式是:模板方法和策略模式
代码实现:
@Configuration @EnableAsync public class AsyncTaskConfig implements AsyncConfigurer { @Override @Bean public Executor getAsyncExecutor() { /** * ThreadPoolExecutor通用线程池 * ThreadPoolTaskExecutor 是再ThradPoolExecutor上面做增强,支持业务执行任务、支持定时任务、spring的线程管理等 */ ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.setCorePoolSize(10); threadPoolTaskExecutor.setMaxPoolSize(100); threadPoolTaskExecutor.setQueueCapacity(10); // 设置线程池全部结束的时候才完全关闭线程 threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); // 当线程关闭的时候需要等待多长时间才进行关闭 threadPoolTaskExecutor.setAwaitTerminationSeconds(60); // 设置线程的名字 threadPoolTaskExecutor.setThreadNamePrefix("Rabbit-Async-"); // 进行初始化 threadPoolTaskExecutor.initialize(); return threadPoolTaskExecutor; } // 需要实现AsynConfiguration的两个方法 @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
2.CompletableFuture总体架构
Future 它是java5添加的接口,用来描述一个异步计算的结果,可以用isDone方法来计算是否完成,或者使用get阻塞往效用线程,直到计算返回结果,可以使用Cancel方法停止任务执行。
CompletableFuture实现Furure接口,不推荐使用get方式阻塞或者轮询方式获取结果。
CompletableFuture.supplyAsync(Runnable,Executor);//支持返回值
CompletableFutre.runAsync(Runnable,Executor);//不支持返回值
3.计算完成时回调方法
whenComplete(BigConsumer):同步完成正常处理结果
whenCompleteAsync(BigConsumer):异步完成处理结果
whenCompleteAysnc(BigConsumer,Executor):异步完成处理结果
exceptionally(Function):处理异常结果
串行化与并行化
串行化:程序从上到下执行的都是一个循序
并行化:从上到下执行顺序不一定
串行化案例
thenApply方法(有返回值):当一个线程依赖另一个线程是,获取上一个任务返回结果,并返回当前任务的返回值
thenAccept方法(无返回值):接受任务的处理结果,并消费处理,无返回值结果。
thenRun方法(最后执行):只有上面的任务执行完成,就开始执行thenRun,只是处理完任务后执行thenRun的后续操作。
并行化案例:
多任务组合
allof().join();:等待所有任务完成之后返回
anyof():只有一个任务完成
到此这篇关于Java异步线程中的CompletableFuture与@Async详解的文章就介绍到这了,更多相关CompletableFuture与@Async内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!