Future
1.检查已分配的任务是否已处理
boolean isDone = future.isDone();
isDone()方法用来判断Future任务是否执行完毕,通常结合get方法使用。
while(!future.isDone()) {System.out.println("Calculating...");Thread.sleep(300);
}
Integer result = future.get();
2.取消任务执行
boolean canceled = future.cancel(true);
completableFuture.cancel(false);
参数false为如果任务已经在执行,则不做取消
3.检查任务是否已取消
boolean isCancelled = future.isCancelled();
CompletableFuture
CompletableFuture继承自Future,他是Future的包装类
创建CompletableFuture
CompletableFuture<String> completableFuture = new CompletableFuture<>();
任务方法使用
1.complete方法:用于手动完成一个 CompletableFuture,并将其结果设置为指定的值,有返回值(感觉多此一举)。
在执行者的excute、submit、invoke方法中设置任务内容,任务内容只能在线程的执行方法中设置。
Future<String> submit = executorService.submit(() -> {Thread.sleep(500);completableFuture.complete("Hello");return null;
});
2.supplyAsync方法:非阻塞方法,用于执行耗时任务,有返回值
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "hello");
3.runAsync方法:非阻塞方法,用于执行耗时任务,无返回值
CompletableFuture.runAsync(() -> {System.out.println("hello");});
4.thenApply方法:阻塞方法,接收上一个任务返回的结果,做出一些处理,有返回值
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<String> resultFuture = future.thenApply(value -> "Result: " + value);
5.thenApplyAsync方法:非阻塞方法,接收上一个任务返回的结果,做出一些处理,有返回值
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Integer> result = future.thenApplyAsync(x -> x * 5);
6.thenCombine方法:接收一个新任务,组合处理这两个任务的结果,有返回值
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
7.thenAccept方法:接收上一个任务返回的结果,做出一些处理,无返回值
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Void> resultFuture = future.thenAccept(value -> System.out.println("Result: " + value));
8.thenRun方法:不接收上一个任务返回的结果,做出一些处理,无返回值
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Void> resultFuture = future.thenRun(() -> System.out.println("任务执行完成"));
9.thenAcceptBoth方法:接收一个新任务,组合处理这两个任务的结果,无返回值
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Hello");future1.thenAcceptBoth(future2, (result1, result2) -> {System.out.println(result1 + " " + result2);
});
10.allOf方法:接收n个新任务,返回一个新的任务,通常与get或join一起使用来等待所有子任务完成,但是此方法并不能获取每个子任务的结果,不推荐使用,推荐使用下一个提到的stream流方式
CompletableFuture<String> future1
= CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2
= CompletableFuture.supplyAsync(() -> "Beautiful");
CompletableFuture<String> future3
= CompletableFuture.supplyAsync(() -> "World");CompletableFuture<Void> combinedFuture
= CompletableFuture.allOf(future1, future2, future3);combinedFuture.get();
11.Stream流方法:等待所有任务完成,并处理所有任务的结果,因为调用了join方法,所以会等待。
String combined = Stream.of(future1, future2, future3)
.map(CompletableFuture::join)
.collect(Collectors.joining(" "));
异常处理
方法一:在步骤方法之后加入handle方法来处理异常
String name = null;
CompletableFuture<String> completableFuture
= CompletableFuture.supplyAsync(() -> {if (name == null) {throw new RuntimeException("Computation error!");}return "Hello, " + name;
}).handle((s, t) -> s != null ? s : "Hello, Stranger!");
方法二:异常完成方法completeExceptionally,如果complete方法出现异常则调用catch的completeExceptionally方法
try {int result = 15;completableFuture.complete(result); // Complete successfully
} catch (Exception ex) {completableFuture.completeExceptionally(ex); // Complete exceptionally
}