详解Java CompletableFuture使用方法以及与FutureTask的区别

网友投稿 392 2022-09-20


详解Java CompletableFuture使用方法以及与FutureTask的区别

目录futureTask 创建异步任务创建任务1. .supplyAsync2. .runAsync异步回调1. .thenApply2. .thenAccept3. .exceptionally4. .whenComplete组合处理

总的来说简洁了FutureTask与线程池的配合使用

没啥太大http://区别吧我觉得, 使用方法不一样, 多了一些方法 ???

futureTask 创建异步任务

FutureTask stringFutureTask = new FutureTask<>(() -> {

return "aa";

});

executorService.execute(stringFutureTask);

System.out.println(stringFutureTask.get());

CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {

return "aa";

}, executorService); // 不用手动提交了

System.out.println(future1.get());

还有很多异步回调, 组合处理

创建任务

1. .supplyAsync

创建一个带返回值的任务

2. .runAsync

创建一个不带返回值的任务

ExecutorService executorService = Executors.newFixedThreadPool(1);

// 带返回值

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

try {

System.out.println("future " + new Date());

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "aaa";

}, executorService); // 推荐使用

以上两个方法都有两个构造方法, 默认不指定自定义线程池, 他会指定默认的提交任务的方法

// 查看cpu的核数是否大于1核

private static final boolean useCommonPool =

(ForkJoinPool.getCommonPoolParallelism() > 1);

// 如果大于1核 则调用execute方法, 每次创建一个线程

private static final Executor asyncPool = useCommonPool ?

ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();

static final class ThreadPerTaskExecutor implements Executor {

public void execute(Runnable r) { new Thread(r).start(); }

}

所以推荐自定义线程池的方式

异步回调

指的是 异步任务结束后调用的任务

1. .thenApply

带返回值的异步调用函数, 有入参, 有出参

2. .thenAccept

不带返回值的异步回调函数, 有入参

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

try {

System.out.println("future " + new Date());

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "aaa";

}, executorService);

// future执行完之后执行的异步任务

CompletableFuture thenApply = future.thenApply((result) -> {

System.out.println("future2 " +new Date());

System.out.println(result);

return "bbb" + result;

});

3. .exceptionally

异步任务出现异常调用的回调方法

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

try {

System.out.println("future " + new Date());

Thread.sleep(2000);

int a = 1 / 0;

} catch (InterruptedException e) {

e.printStackTrace();

}

return "aaa";

}, executorService);

CompletableFuture exceptionally = future.exceptionally((result) -> {

System.out.println("future3 " + result);

return "bbb" + result;

});

// 出现异常则返回异常, 没异常则返回future的返回值

System.out.println(exceptionally.get());

去掉异常

4. .whenComplete

当主任务出现RnbQtDy异常时, 会终止任务,get的时候会抛出主任务的异常, 入参值为null, 否则正常运行

CompletableFuture future = CompletableFuture.supplyAsync(() -> {

try {

System.out.println("future " + new Date());

Thread.sleep(2000);

int a = 1/0;

} catch (InterruptedException e) {

e.printStackTrace();

}

return "aaa";

}, executorService);

CompletableFuture exceptionally = future.whenComplete((result, error) -> {

System.out.println("future3 " + result);

System.out.println("future3 " + error);

});

System.out.println(exceptionally.geRnbQtDyt());

去掉异常

组合处理

....

就是将多个任务组合起来执行, 时间原因, 这里我就不介绍了, 大家另行百度吧


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:路由交换机-不同厂商对OSPF五类LSA中多条前缀相同掩码路由计算方式不同导致业务故障的案例
下一篇:故障处理之某网站不能访问(在访问某www站点时,由于某些原因)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~