{"id":1926,"date":"2024-06-19T12:16:06","date_gmt":"2024-06-19T12:16:06","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1926"},"modified":"2024-06-19T12:16:15","modified_gmt":"2024-06-19T12:16:15","slug":"javas-completablefuture-for-asynchronous-programming","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/","title":{"rendered":"How to Use Java&#8217;s CompletableFuture for Asynchronous Programming"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Asynchronous programming is crucial for developing responsive and efficient applications. In Java, the <code>CompletableFuture<\/code> class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming. This tutorial aims to provide a comprehensive guide on how to use <code>CompletableFuture<\/code> for non-beginners who are already familiar with Java but want to enhance their skills in asynchronous programming.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to CompletableFuture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CompletableFuture<\/code> is part of the <code>java.util.concurrent<\/code> package and provides a way to write non-blocking, asynchronous code. It represents a future result of an asynchronous computation, allowing you to attach callbacks that will be executed upon its completion.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Non-blocking<\/strong>: <code>CompletableFuture<\/code> provides methods to attach callbacks that get executed without blocking the main thread.<\/li>\n\n\n\n<li><strong>Composability<\/strong>: It allows combining multiple futures in various ways, such as running them in parallel or chaining them sequentially.<\/li>\n\n\n\n<li><strong>Exception Handling<\/strong>: It provides mechanisms to handle exceptions gracefully in asynchronous workflows.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Creating a CompletableFuture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Basic Creation and Completion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can create a <code>CompletableFuture<\/code> instance using its static factory methods or directly through its constructor. Here are some common ways to create and complete a <code>CompletableFuture<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Creating a CompletableFuture<\/span>\n        CompletableFuture&lt;String&gt; future = <span class=\"hljs-keyword\">new<\/span> CompletableFuture&lt;&gt;();\n\n        <span class=\"hljs-comment\">\/\/ Completing a CompletableFuture manually<\/span>\n        future.complete(<span class=\"hljs-string\">\"Hello, World!\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Printing the result<\/span>\n        future.thenAccept(result -&gt; System.out.println(result));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using Static Factory Methods<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CompletableFuture<\/code> provides several static methods to create pre-completed futures or futures that complete asynchronously.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Creating a completed future<\/span>\n        CompletableFuture&lt;String&gt; completedFuture = CompletableFuture.completedFuture(<span class=\"hljs-string\">\"Hello, World!\"<\/span>);\n        completedFuture.thenAccept(System.out::println);\n\n        <span class=\"hljs-comment\">\/\/ Running a task asynchronously<\/span>\n        CompletableFuture&lt;Void&gt; asyncFuture = CompletableFuture.runAsync(() -&gt; {\n            <span class=\"hljs-comment\">\/\/ Simulate a long-running task<\/span>\n            <span class=\"hljs-keyword\">try<\/span> {\n                Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n            } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n                e.printStackTrace();\n            }\n            System.out.println(<span class=\"hljs-string\">\"Task completed\"<\/span>);\n        });\n\n        <span class=\"hljs-comment\">\/\/ Waiting for the async task to complete<\/span>\n        asyncFuture.join();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Combining Multiple CompletableFutures<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Chaining Futures<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One of the powerful features of <code>CompletableFuture<\/code> is the ability to chain multiple futures together.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureChainingExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>)\n                .thenApply(result -&gt; result + <span class=\"hljs-string\">\", World!\"<\/span>)\n                .thenAccept(System.out::println);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Combining Futures<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can combine multiple futures using methods like <code>thenCombine<\/code>, <code>thenCompose<\/code>, and <code>allOf<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureCombiningExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>);\n        CompletableFuture&lt;String&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"World\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Combining results of two futures<\/span>\n        CompletableFuture&lt;String&gt; combinedFuture = future1.thenCombine(future2, (result1, result2) -&gt; result1 + <span class=\"hljs-string\">\" \"<\/span> + result2);\n\n        combinedFuture.thenAccept(System.out::println);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Waiting for All Futures<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you need to wait for multiple futures to complete, you can use <code>allOf<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureAllOfExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 1\"<\/span>);\n        CompletableFuture&lt;String&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 2\"<\/span>);\n        CompletableFuture&lt;String&gt; future3 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 3\"<\/span>);\n\n        CompletableFuture&lt;Void&gt; allOf = CompletableFuture.allOf(future1, future2, future3);\n\n        allOf.thenRun(() -&gt; {\n            System.out.println(<span class=\"hljs-string\">\"All tasks completed\"<\/span>);\n        }).join();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handling Any Completed Future<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can also wait for any one of the futures to complete using <code>anyOf<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureAnyOfExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 1\"<\/span>);\n        CompletableFuture&lt;String&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 2\"<\/span>);\n        CompletableFuture&lt;String&gt; future3 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task 3\"<\/span>);\n\n        CompletableFuture&lt;Object&gt; anyOf = CompletableFuture.anyOf(future1, future2, future3);\n\n        anyOf.thenAccept(result -&gt; {\n            System.out.println(<span class=\"hljs-string\">\"First completed task: \"<\/span> + result);\n        }).join();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Handling Exceptions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Exception handling is an essential aspect of asynchronous programming. <code>CompletableFuture<\/code> provides methods to handle exceptions gracefully.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Handling Exceptions with exceptionally<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can use the <code>exceptionally<\/code> method to provide a fallback value in case of an exception.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureExceptionallyExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; future = CompletableFuture.supplyAsync(() -&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Something went wrong\"<\/span>);\n            }\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hello, World!\"<\/span>;\n        });\n\n        future.exceptionally(ex -&gt; {\n            System.err.println(<span class=\"hljs-string\">\"Exception: \"<\/span> + ex.getMessage());\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Fallback value\"<\/span>;\n        }).thenAccept(System.out::println);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handling Exceptions with handle<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>handle<\/code> method allows you to process the result and handle the exception in one place.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureHandleExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; future = CompletableFuture.supplyAsync(() -&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Something went wrong\"<\/span>);\n            }\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hello, World!\"<\/span>;\n        });\n\n        future.handle((result, ex) -&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (ex != <span class=\"hljs-keyword\">null<\/span>) {\n                System.err.println(<span class=\"hljs-string\">\"Exception: \"<\/span> + ex.getMessage());\n                <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Fallback value\"<\/span>;\n            }\n            <span class=\"hljs-keyword\">return<\/span> result;\n        }).thenAccept(System.out::println);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Combining Exception Handling and Chaining<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can combine exception handling with chaining to create robust asynchronous workflows.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureExceptionHandlingExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture.supplyAsync(() -&gt; {\n            <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Something went wrong\"<\/span>);\n            }\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hello\"<\/span>;\n        })\n        .exceptionally(ex -&gt; {\n            System.err.println(<span class=\"hljs-string\">\"Exception: \"<\/span> + ex.getMessage());\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Fallback value\"<\/span>;\n        })\n        .thenApply(result -&gt; result + <span class=\"hljs-string\">\", World!\"<\/span>)\n        .thenAccept(System.out::println);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Using CompletableFuture with Streams<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Java Streams and <code>CompletableFuture<\/code> can be combined to process collections of asynchronous tasks efficiently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Transforming a List of Futures<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can transform a list of futures into a future of a list using the <code>allOf<\/code> method.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.List;\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.Collectors;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.IntStream;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureStreamExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        List&lt;CompletableFuture&lt;String&gt;&gt; futures = IntStream.range(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">6<\/span>)\n                .mapToObj(i -&gt; CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Task \"<\/span> + i))\n                .collect(Collectors.toList());\n\n        CompletableFuture&lt;Void&gt; allOf = CompletableFuture.allOf(futures.toArray(<span class=\"hljs-keyword\">new<\/span> CompletableFuture&#91;<span class=\"hljs-number\">0<\/span>]));\n\n        CompletableFuture&lt;List&lt;String&gt;&gt; allFutures = allOf.thenApply(v -&gt; \n            futures.stream()\n                .map(CompletableFuture::join)\n                .collect(Collectors.toList())\n        );\n\n        allFutures.thenAccept(results -&gt; {\n            results.forEach(System.out::println);\n        }).join();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Parallel Processing with Streams<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can use parallel streams to initiate multiple asynchronous tasks in parallel.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.Collectors;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.IntStream;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CompletableFutureParallelStreamExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&#91;] futures = IntStream.range(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">6<\/span>)\n                .parallel()\n                .mapToObj(i -&gt; CompletableFuture.runAsync(() -&gt; {\n                    <span class=\"hljs-keyword\">try<\/span> {\n                        Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n                    } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                    System.out.println(<span class=\"hljs-string\">\"Task \"<\/span> + i + <span class=\"hljs-string\">\" completed\"<\/span>);\n                }))\n                .toArray(CompletableFuture&#91;]::<span class=\"hljs-keyword\">new<\/span>);\n\n        CompletableFuture.allOf(futures).join();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. Real-world Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Example 1: Fetching Data from Multiple APIs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine you need to fetch data from multiple APIs and combine the results. <code>CompletableFuture<\/code> makes this task straightforward.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FetchDataExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        CompletableFuture&lt;String&gt; api1 = CompletableFuture.supplyAsync(() -&gt; fetchFromAPI1());\n        CompletableFuture&lt;String&gt; api2 = CompletableFuture.supplyAsync(() -&gt; fetchFromAPI2());\n        CompletableFuture&lt;String&gt; api3 = CompletableFuture.supplyAsync(() -&gt; fetchFromAPI3());\n\n        CompletableFuture&lt;Void&gt; allOf = CompletableFuture.allOf(api1, api2, api3);\n\n        allOf.thenRun(() -&gt; {\n            String result1 = api1.join();\n            String result2 = api2.join();\n            String result3 = api3.join();\n\n            String combinedResult = result1 + <span class=\"hljs-string\">\", \"<\/span> + result2 + <span class=\"hljs-string\">\", \"<\/span> + result3;\n            System.out.println(<span class=\"hljs-string\">\"Combined Result: \"<\/span> + combinedResult);\n        }).join();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">fetchFromAPI1<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Simulate API call<\/span>\n        <span class=\"hljs-keyword\">try<\/span> {\n            Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            e.printStackTrace();\n        }\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Data from API 1\"<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">fetchFromAPI2<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Simulate API call<\/span>\n        <span class=\"hljs-keyword\">try<\/span> {\n            Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            e.printStackTrace();\n        }\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Data from API 2\"<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">fetchFromAPI3<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Simulate API call<\/span>\n        <span class=\"hljs-keyword\">try<\/span> {\n            Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            e.printStackTrace();\n        }\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Data from API 3\"<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Example 2: Processing a Batch of Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose you need to process a batch of tasks in parallel and collect their results.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.List;\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.Collectors;\n<span class=\"hljs-keyword\">import<\/span> java.util.stream.IntStream;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BatchProcessingExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        List&lt;CompletableFuture&lt;String&gt;&gt; futures = IntStream.range(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">11<\/span>)\n                .mapToObj(i -&gt; CompletableFuture.supplyAsync(() -&gt; processTask(i)))\n                .collect(Collectors.toList());\n\n        CompletableFuture&lt;Void&gt; allOf = CompletableFuture.allOf(futures.toArray(<span class=\"hljs-keyword\">new<\/span> CompletableFuture&#91;<span class=\"hljs-number\">0<\/span>]));\n\n        CompletableFuture&lt;List&lt;String&gt;&gt; allFutures = allOf.thenApply(v -&gt; \n            futures.stream()\n                .map(CompletableFuture::join)\n                .collect(Collectors.toList())\n        );\n\n        allFutures.thenAccept(results -&gt; {\n            results.forEach(System.out::println);\n        }).join();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> String <span class=\"hljs-title\">processTask<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> i)<\/span> <\/span>{\n        <span class=\"hljs-comment\">\/\/ Simulate a long-running task<\/span>\n        <span class=\"hljs-keyword\">try<\/span> {\n            Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            e.printStackTrace();\n        }\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Task \"<\/span> + i + <span class=\"hljs-string\">\" completed\"<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Best Practices<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Avoid Blocking Calls<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid blocking calls like <code>join<\/code> or <code>get<\/code> inside the <code>CompletableFuture<\/code> chain. Instead, use asynchronous methods and callbacks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use Executor for Custom Thread Pools<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, <code>CompletableFuture<\/code> uses the ForkJoinPool.commonPool() for async tasks. For better control, provide a custom executor.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.ExecutorService;\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.Executors;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomExecutorExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        ExecutorService executor = Executors.newFixedThreadPool(<span class=\"hljs-number\">10<\/span>);\n\n        CompletableFuture&lt;Void&gt; future = CompletableFuture.runAsync(() -&gt; {\n            <span class=\"hljs-comment\">\/\/ Task logic here<\/span>\n            System.out.println(<span class=\"hljs-string\">\"Task running in custom executor\"<\/span>);\n        }, executor);\n\n        future.join();\n        executor.shutdown();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handle Exceptions Properly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure to handle exceptions at every stage of the <code>CompletableFuture<\/code> chain to avoid unexpected behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use Completion Stages<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Completion stages like <code>thenApplyAsync<\/code>, <code>thenAcceptAsync<\/code>, and <code>thenRunAsync<\/code> allow you to offload work to a different thread pool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keep Chains Short and Simple<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Long chains of <code>CompletableFuture<\/code> can become difficult to read and maintain. Break them into smaller, manageable pieces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CompletableFuture<\/code> is a versatile and powerful tool for asynchronous programming in Java. It allows you to write non-blocking, efficient, and scalable code by providing a rich API for composing and combining asynchronous tasks. By following best practices and understanding how to handle exceptions and combine futures, you can leverage <code>CompletableFuture<\/code> to build robust and responsive applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial has covered the basics of creating, combining, and handling exceptions with <code>CompletableFuture<\/code>, along with practical examples and best practices. With this knowledge, you can confidently implement asynchronous programming in your Java projects, improving performance and responsiveness.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asynchronous programming is crucial for developing responsive and efficient applications. In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming. This tutorial aims to provide a comprehensive guide on how to use CompletableFuture for non-beginners who are already familiar with Java but want to enhance their [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,4],"tags":[],"class_list":["post-1926","post","type-post","status-publish","format-standard","category-java","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Java&#039;s CompletableFuture for Asynchronous Programming<\/title>\n<meta name=\"description\" content=\"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Java&#039;s CompletableFuture for Asynchronous Programming\" \/>\n<meta property=\"og:description\" content=\"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-19T12:16:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-19T12:16:15+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"How to Use Java&#8217;s CompletableFuture for Asynchronous Programming\",\"datePublished\":\"2024-06-19T12:16:06+00:00\",\"dateModified\":\"2024-06-19T12:16:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/\"},\"wordCount\":623,\"articleSection\":[\"Java\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/\",\"name\":\"Using Java's CompletableFuture for Asynchronous Programming\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-19T12:16:06+00:00\",\"dateModified\":\"2024-06-19T12:16:15+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/javas-completablefuture-for-asynchronous-programming\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Use Java&#8217;s CompletableFuture for Asynchronous Programming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Java's CompletableFuture for Asynchronous Programming","description":"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/","og_locale":"en_US","og_type":"article","og_title":"Using Java's CompletableFuture for Asynchronous Programming","og_description":"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.","og_url":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/","article_published_time":"2024-06-19T12:16:06+00:00","article_modified_time":"2024-06-19T12:16:15+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"How to Use Java&#8217;s CompletableFuture for Asynchronous Programming","datePublished":"2024-06-19T12:16:06+00:00","dateModified":"2024-06-19T12:16:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/"},"wordCount":623,"articleSection":["Java","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/","url":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/","name":"Using Java's CompletableFuture for Asynchronous Programming","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-19T12:16:06+00:00","dateModified":"2024-06-19T12:16:15+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"In Java, the CompletableFuture class introduced in Java 8 offers a powerful and flexible way to handle asynchronous programming.","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/javas-completablefuture-for-asynchronous-programming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"How to Use Java&#8217;s CompletableFuture for Asynchronous Programming"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1926"}],"version-history":[{"count":2,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1926\/revisions"}],"predecessor-version":[{"id":1928,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1926\/revisions\/1928"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}