背景
在Java编程中,经常需要异步执行某个任务,一般继承Thread类或实现Runnable接口的方法来异步执行任务,除了这两种方法外,还可实现Callable来实现,在使用Callable的同时一般都会使用Future来配合获取执行结果,这几种方式使用起来或多或少存在不足,在jdk1.8中,提供了一个异步处理任务的工具CompletableFuture,接下来就通过实际代码体验CompletableFuture的使用。
创建异步线程任务
根据supplier创建CompletableFuture任务
ExecutorService executor = Executors.newSingleThreadExecutor();
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> System.out.println("hello CompletableFuture1"), executor);
// supplyAsync的使用
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> {
System.out.print("hello ");
return "CompletableFuture2";
}, executor);
// 阻塞等待,runAsync 的future 无返回值,输出null
System.out.println(completableFuture.join());
// 阻塞等待
String name = future.join();
System.out.println(name);
executor.shutdown();
--------输出结果--------
hello CompletableFuture1
null
hello CompletableFuture2
线程串行执行
任务完成则运行action,不关心上一个任务的结果,无返回值
CompletableFuture<Void> future = CompletableFuture
.supplyAsync(() -> "hello siting", executor)
.thenRunAsync(() -> System.out.println("OK"), executor);
executor.shutdown();
--------输出结果--------
OK
任务完成则运行fn,依赖上一个任务的结果,有返回值
ExecutorService executor = Executors.newSingleThreadExecutor();
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> "hello world", executor)
.thenApplyAsync(data -> {
System.out.println(data); return "OK";
}, executor);
System.out.println(future.join());
executor.shutdown();
--------输出结果--------
hello world
OK
thenCompose - 任务完成则运行fn,依赖上一个任务的结果,有返回值
//第一个异步任务,常量任务
CompletableFuture<String> f = CompletableFuture.completedFuture("OK");
//第二个异步任务
ExecutorService executor = Executors.newSingleThreadExecutor();
CompletableFuture<String> future = CompletableFuture
.supplyAsync((