zoukankan      html  css  js  c++  java
  • 【CompletableFuture】CompletableFuture中join()和get()方法的区别

    声明

    本文转自:https://www.cnblogs.com/july-sunny/p/12706473.html

    一.相同点:

      join()和get()方法都是用来获取CompletableFuture异步之后的返回值

    二.区别:

      1.join()方法抛出的是uncheck异常(即未经检查的异常),不会强制开发者抛出,

      会将异常包装成CompletionException异常 /CancellationException异常,但是本质原因还是代码内存在的真正的异常,

      文档说明:

    复制代码
      /**
         * Returns the result value when complete, or throws an
         * (unchecked) exception if completed exceptionally. To better
         * conform with the use of common functional forms, if a
         * computation involved in the completion of this
         * CompletableFuture threw an exception, this method throws an
         * (unchecked) {@link CompletionException} with the underlying
         * exception as its cause.
         *
         * @return the result value
         * @throws CancellationException if the computation was cancelled
         * @throws CompletionException if this future completed
         * exceptionally or a completion computation threw an exception
         */
    复制代码

      demo:

    复制代码
        public static void main(String[] args) {
            CompletableFuture<Integer> f1 = CompletableFuture.supplyAsync(() -> {
                int i =1/0;
                return 1;
            });
            CompletableFuture.allOf(f1).join();
            System.out.println("CompletableFuture Test");
        }
    复制代码

      异常信息

    复制代码
    Exception in thread "main" java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
        at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
        at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)
        at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
    Caused by: java.lang.ArithmeticException: / by zero
        at com.gabriel.stage.utils.IpAddressUtil.lambda$main$0(IpAddressUtil.java:44)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
        ... 5 more
    复制代码

      2.get()方法抛出的是经过检查的异常,ExecutionException, InterruptedException 需要用户手动处理(抛出或者 try catch)

      文档说明

    复制代码
     /**
         * Waits if necessary for this future to complete, and then
         * returns its result.
         *
         * @return the result value
         * @throws CancellationException if this future was cancelled
         * @throws ExecutionException if this future completed exceptionally
         * @throws InterruptedException if the current thread was interrupted
         * while waiting
         */
    复制代码

      demo

    复制代码
    public static void main(String[] args) throws ExecutionException, InterruptedException {
            CompletableFuture<Integer> f1 = CompletableFuture.supplyAsync(() -> {
                int i =1/0;
                return 1;
            });
            f1.get();
            System.out.println("CompletableFuture Test");
        }
    复制代码

    作者:习惯沉淀

    如果文中有误或对本文有不同的见解,欢迎在评论区留言。

    如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!

    扫码关注一线码农的学习见闻与思考。

    回复"大数据","微服务","架构师","面试总结",获取更多学习资源!
  • 相关阅读:
    leetcode 34 rust
    leetcode 2 rust
    leetcode 1 rust
    leetcode 20 rust
    leetcode 287 rust
    leetcode 18 rust
    lottery抽奖
    webpack
    webpack(7)-生产环境
    webpack(6)-模块热替代&tree shaking
  • 原文地址:https://www.cnblogs.com/yadongliang/p/14659301.html
Copyright © 2011-2022 走看看