makhocheung / ShareDemo

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Java中的异步

1. JDK

Future/Promise模式,Java程序异步执行耗时程序后立马返回一个对象Future代表将来,主程序会继续执行下去不会被阻塞。可以通过Future来获取异步的结果。

  • Future和FutureTask
    有一个get方法,可以获取异步执行的结果,但是是个blocking api,例子
  • CompletionService
    封装了线程池,能按任务完成的先后顺序来获取Future,当提交多个异步任务之后可以通过take来获取已经完成的Future并马上获取任务的结果。例子
  • CompletableFuture
    Java8新的api,有50多个方法,能够在执行完任务之后回调函数,基于Promise模式
    //获取Future
    CompletableFuture.runAsync(Runnable runnable)
    
    CompletableFuture.supplyAsync(Supplier supplier)
    
    //逻辑判断
    CompletableFuture.allOf​(CompletableFuture<?>... cfs)
    
    CompletableFuture.anyOf​(CompletableFuture<?>... cfs)
    
    //常用实例方法,快速熟悉
    boolean isDone​()
    
    CompletableFuture thenApply​(Function<? super T,? extends U> fn)
    
    CompletableFuture thenAccept​(Consumer<? super T> action)
    
    CompletableFuture thenCombine​(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)
    
    CompletableFuture thenCompose​(Function<? super T,? extends CompletionStage<U>> fn)
    
    CompletableFuture whenComplete​(BiConsumer<? super T,? super Throwable> action)

建议:个人觉得就是比自己开线程更加方便。

2. Vert.x(Reactor模式)

Vert.x框架基于事件和异步,依托于全异步Java服务器Netty,并扩展了很多其他特性,以其轻量、高性能、支持多语言开发而备受开发者青睐。Event loop+Future

  • Vertx
    用来部署Verticle,一个应用只有一个Vertx
  • Verticle(普通的Verticle没有多线程)
    好像一个空间,代码都只有一条线程在跑,类似Actor
  • Handler
    回调函数
  • EventBus(类似Actor))
    各个Verticle之间通信

About


Languages

Language:Java 100.0%