让天下没有难学的javajava
点赞、关注、收藏 编程
Future机制是Java 1.5中的引入的,表明着一个异步计算的结果。关于Future/Callable能够参考多线程
juejin.im/post/5e0819… ,保证你瞬间有了层次感。不至于什么都会,可是好像又挺糊涂。app
Future解决了Runnable无返回值的问题,提供了2种get()来获取结果。异步
public interface Future<V>{
//堵塞获取
V get() throws InterruptedException,ExecutionException;
//等待timeout获取
V get(long timeout,TimeUnit unit) throws InterruptedException,ExecutionException,TimeoutException;
}
复制代码
//接受Runnable,无返回值,使用ForkJoinPool.commonPool()线程池
public static CompletableFuture<Void> runAsync(Runnable runnable) //接受Runnable,无返回值,使用指定的executor线程池 public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) //接受Supplier,返回U,使用ForkJoinPool.commonPool()线程池 public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) //接受Supplier,返回U,使用指定的executor线程池 public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) 复制代码
runAsync无返回值 异步编程
supplyAsync有返回值 函数
Stage是阶段的意思。顾名思义,CompletionStage它表明了某个同步或者异步计算的一个阶段,最终结果上的一个环节。多个CompletionStage构成了一条流水线,一个环节组装完成了能够移交给下一个环节。一个结果可能须要流转了多个CompletionStage。post
如很常见的一个兑换场景,先扣积分、而后发短信、而后设置我的主页标识,这其中扣积分、发短信、设置标识分别是一个Stage。学习
CompletableFuture链式调用背后就是CompletionStage来提供支持,CompletionStage的thenApply().thenApply()...一环扣一环。spa
简单的CompletionStage,supplyAsync()异步任务执行完后使用thenApply()将结果传递给下一个stage。
//这是最简单也是最经常使用的一个方法,CompletableFuture的链式调用
public static void main(String[] args) {
CompletableFuture<String> completableFuture = CompletableFuture.runAsync(() -> {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("hello");
}catch (Exception e){
e.printStackTrace();
}
}).thenApply(s1 -> {
System.out.println(" big");
return s1 + "big";
}).thenApply(s2 -> " world");
}
//hello big world
复制代码
thenRun
thenAccept
CompletableFuture<Void> completableFuture = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(5);
return "success";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}).thenAcceptAsync(s->{
if ("success".equals(s)){
System.out.println(s);
}else {
System.err.println(s);
}
});
复制代码
public <U> CompletableFuture<U> thenCompose(Function<? super T, ? extends CompletionStage<U>> fn) public <U> CompletableFuture<U> thenComposeAsync(Function<? super T, ? extends CompletionStage<U>> fn) public <U> CompletableFuture<U> thenComposeAsync(Function<? super T, ? extends CompletionStage<U>> fn, Executor executor) 复制代码
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1)
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1));
复制代码
thenApply、thenCompose都接受一个Function的函数式接口,那么区别呢? 1.thenApply使用在同步mapping方法。 2.thenCompose使用在异步mapping方法。
//thenApply
thenApply(Function<? super T,? extends U> fn)
//thenCompose
thenCompose(Function<? super T,? extends CompletableFuture<U>> fn)
//能够看出thenApply返回的是一个对象U,而thenCompose返回的是CompletableFuture<U>
//从使用角度是来看,若是你第二个操做也是异步操做那么使用thenCompose,若是是一个简单同步操做,那么使用thenApply,相信实战几回你就能明白何时使用thenApply、thenCompose。
复制代码
thenCombine
🌰来了
//从上图能够看出,thenCombine的2个CompletableFuture不是依赖关系,第二个CompletableFuture比第一个CompletableFuture先执行,最后的BiFunction()组合2个CompletableFuture结果。
//再次强调:整个流水线是同步的
复制代码
//2个CompletableFuture处理完成后,将结果进行消费。
//与thenCombine相似,第2个CompletableFuture不依赖第1个CompletableFuture执行完成,返回值Void。
复制代码
public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) 复制代码
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println("i am sleep 1");
} catch (Exception e) {
e.printStackTrace();
}
return "service 1";
});
CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(2);
System.out.println("i am sleep 2");
} catch (Exception e) {
e.printStackTrace();
}
return "service 2";
});
CompletableFuture<String> completableFuture3 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("i am sleep 3");
} catch (Exception e) {
e.printStackTrace();
}
return "service 3";
});
CompletableFuture<Void> completableFuture = CompletableFuture
.allOf(completableFuture1, completableFuture2, completableFuture3);
completableFuture.join();
System.out.println(System.currentTimeMillis() - start);
}
复制代码