java8
来源:互联网 发布:windows开发unity ios 编辑:程序博客网 时间:2024/06/05 03:45
CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。
为了解决这个问题,JDK吸收了guava的设计思想,加入了Future的诸多扩展功能形成了CompletableFuture。CompletableFuture可以在某个线程完成某任务的时候回调某个函数
CompletableFuture 主要API如下
变换操作
public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn);public <U> CompletionStage<U> thenApplyAsync(Function<? super T,? extends U> fn);public <U> CompletionStage<U> thenApplyAsync(Function<? super T,? extends U> fn,Executor executor);
例如
public void thenApplay() { String result = CompletableFuture.supplyAsync(() -> "hello").thenApply(s -> s + " world").join(); System.out.println(result);}
运行结果为
hello world
消耗操作
public CompletionStage<Void> thenAccept(Consumer<? super T> action);public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action);public CompletionStage<Void> thenAcceptAsync(Consumer<? super T> action,Executor executor);
示例
@Test public void thenAccept(){ CompletableFuture.supplyAsync(()->"hello").thenAccept(s-> System.out.println(s+" world")); }
运行结果为
hello world
对上一步的计算结果不关心,执行下一个操作
public CompletionStage<Void> thenRun(Runnable action);public CompletionStage<Void> thenRunAsync(Runnable action);public CompletionStage<Void> thenRunAsync(Runnable action,Executor executor);
示例
public void thenRun(){ CompletableFuture.supplyAsync(()->{ try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello World"; }).thenRun(()-> System.out.println("Hello World"));}
运行结果
Hello World
结合两个CompletionStage经过转化后返回
public <U,V> CompletionStage<V> thenCombine(CompletionStage<? extends U> other,BiFunction<? super T,? super U,? extends V> fn);public <U,V> CompletionStage<V> thenCombineAsync(CompletionStage<? extends U> other,BiFunction<? super T,? super U,? extends V> fn);public <U,V> CompletionStage<V> thenCombineAsync(CompletionStage<? extends U> other,BiFunction<? super T,? super U,? extends V> fn,Executor executor);
示例
public void thenCombine(){ String result=CompletableFuture.supplyAsync(()->{ return "hello "; }).thenCombine(CompletableFuture.supplyAsync(()->{ return "world"; }),(s1,s2)->s1+s2).join(); System.out.println(result); }
运行结果
hello world
在两个CompletionStage都运行完执行
public CompletionStage<Void> runAfterBoth(CompletionStage<?> other,Runnable action);public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,Runnable action);public CompletionStage<Void> runAfterBothAsync(CompletionStage<?> other,Runnable action,Executor executor);
示例
public void thenAfterRun() { CompletableFuture.supplyAsync(() -> "Hello") .runAfterBoth(CompletableFuture.supplyAsync(() -> " World"), () -> System.out.println("Hello World"));}
运行结果
Hello World
调用优先执行完的结果进行处理
public <U> CompletionStage<U> applyToEither(CompletionStage<? extends T> other,Function<? super T, U> fn);public <U> CompletionStage<U> applyToEitherAsync(CompletionStage<? extends T> other,Function<? super T, U> fn);public <U> CompletionStage<U> applyToEitherAsync(CompletionStage<? extends T> other,Function<? super T, U> fn,Executor executor);
示例
public void applyToEither(){ String result=CompletableFuture.supplyAsync(()->"hello").applyToEither(CompletableFuture.supplyAsync(()->" World"),s->s).join(); System.out.println(result); }
运行结果
hello
调用优先执行完的结果进行消耗
这个API与上一个API优点像不同点在于上一个API有返回值
public CompletionStage<Void> acceptEither(CompletionStage<? extends T> other,Consumer<? super T> action);public CompletionStage<Void> acceptEitherAsync(CompletionStage<? extends T> other,Consumer<? super T> action);public CompletionStage<Void> acceptEitherAsync(CompletionStage<? extends T> other,Consumer<? super T> action,Executor executor);
示例
public void acceptEither(){ CompletableFuture.supplyAsync(()->"Hello") .acceptEither(CompletableFuture.supplyAsync(()->"World"),System.out::println);}
运行结果
Hello
只要有一个完成就执行下一步操作
public CompletionStage<Void> runAfterEither(CompletionStage<?> other,Runnable action);public CompletionStage<Void> runAfterEitherAsync(CompletionStage<?> other,Runnable action);public CompletionStage<Void> runAfterEitherAsync(CompletionStage<?> other,Runnable action,Executor executor);
示例
public void runAfterEigher() { CompletableFuture.supplyAsync(() -> { while (true) { } }).runAfterEither(CompletableFuture.supplyAsync(() -> "s2"), () -> System.out.println("finish"));
运行结果
finish
异常处理
public CompletionStage<T> exceptionally(Function<Throwable, ? extends T> fn);
示例
public void exceptionally() { String result = (String) CompletableFuture.supplyAsync(() -> { throw new RuntimeException("异常"); }).exceptionally(e -> { System.out.println(e.getMessage()); return "hello world"; }).join(); System.out.println(result); }
结果为
java.lang.RuntimeException: 异常hello world
记录结果
运行完成时,对结果
public CompletionStage<T> whenComplete(BiConsumer<? super T, ? super Throwable> action);public CompletionStage<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action);public CompletionStage<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action,Executor executor);
示例
public void whenComplete() { String result = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } if (1 == 1) { throw new RuntimeException("测试一下异常情况"); } return "s1"; }).whenComplete((s, t) -> { System.out.println(s); System.out.println(t.getMessage()); }).exceptionally(e -> { System.out.println(e.getMessage()); return "hello world"; }).join(); System.out.println(result); }
运行完成时处理结果
public <U> CompletionStage<U> handle(BiFunction<? super T, Throwable, ? extends U> fn);public <U> CompletionStage<U> handleAsync(BiFunction<? super T, Throwable, ? extends U> fn);public <U> CompletionStage<U> handleAsync(BiFunction<? super T, Throwable, ? extends U> fn,Executor executor);
示例
public void handle() { String result = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //出现异常 if (1 == 1) { throw new RuntimeException("测试一下异常情况"); } return "s1"; }).handle((s, t) -> { if (t != null) { return "hello world"; } return s; }).join(); System.out.println(result); }
结果为
hello world
阅读全文
0 0
- Java8
- java8
- Java8
- java8
- java8
- java8
- java8
- Java8
- Java8
- Java8
- java8
- java8
- JAVA8
- JAVA8
- java8
- Java8
- java8
- java8
- THINKPHP 防止重复提交表单 自己实现token
- WOJ 1016
- ubuntu进入root界面快捷键
- SimpleDateFormat 24小时和12小时转换
- git
- java8
- 1111
- Python标准库:内置函数max(iterable, *[, key, default])
- eclipse使用Maven导入jar包时检索本地仓库检索不到
- MyEclipse server窗口出现Could not create the view: An unexpected exception was thrown
- 1对1关联关系映射
- 【章节3】数据库和数据表的创建及基本操作
- TabLayout与viewpager
- Python 基础学习之安装python及其模块安装