{"id":436,"date":"2026-03-14T05:55:00","date_gmt":"2026-03-14T05:55:00","guid":{"rendered":"https:\/\/harshad-sonawane.com\/blog\/?p=436"},"modified":"2026-01-15T06:16:22","modified_gmt":"2026-01-15T06:16:22","slug":"mastering-asynchronous-programming-java-completablefuture","status":"publish","type":"post","link":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/","title":{"rendered":"Mastering Asynchronous Programming in Java with CompletableFuture"},"content":{"rendered":"<p data-start=\"372\" data-end=\"660\">Modern applications are expected to be fast, responsive, and capable of handling multiple operations concurrently. In <a href=\"https:\/\/harshad-sonawane.com\/blog\/reduce-cloud-costs-java-applications\/\">Java<\/a>, traditional multithreading using <code data-start=\"529\" data-end=\"537\">Thread<\/code>, <code data-start=\"539\" data-end=\"549\">Runnable<\/code>, and <code data-start=\"555\" data-end=\"572\">ExecutorService<\/code> often leads to verbose code, complex error handling, and difficult-to-maintain logic.<\/p>\n<p data-start=\"662\" data-end=\"791\">This is where <strong data-start=\"676\" data-end=\"697\">CompletableFuture<\/strong>, introduced in Java 8, fundamentally changes how we write asynchronous and non-blocking code.<\/p>\n<p data-start=\"793\" data-end=\"1000\">In this article, we will explore <strong data-start=\"826\" data-end=\"866\">CompletableFuture from the ground up<\/strong>, understand its internal behavior, learn advanced composition techniques, and apply real-world performance and design best practices.<\/p>\n<hr data-start=\"1002\" data-end=\"1005\" \/>\n<h2 data-start=\"1007\" data-end=\"1046\">Why Asynchronous Programming Matters<\/h2>\n<p data-start=\"1048\" data-end=\"1201\">Synchronous code blocks the executing thread until the task completes. In I\/O-heavy systems\u2014such as <a href=\"https:\/\/harshad-sonawane.com\/blog\/audit-logging-in-java-microservices-techniques-and-compliance-tips\/\">microservices<\/a>, APIs, or data pipelines\u2014this leads to:<\/p>\n<ul data-start=\"1203\" data-end=\"1267\">\n<li data-start=\"1203\" data-end=\"1224\">\n<p data-start=\"1205\" data-end=\"1224\">Thread starvation<\/p>\n<\/li>\n<li data-start=\"1225\" data-end=\"1246\">\n<p data-start=\"1227\" data-end=\"1246\">Increased latency<\/p>\n<\/li>\n<li data-start=\"1247\" data-end=\"1267\">\n<p data-start=\"1249\" data-end=\"1267\">Poor scalability<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1269\" data-end=\"1414\">Asynchronous programming allows tasks to execute <strong data-start=\"1318\" data-end=\"1335\">independently<\/strong>, freeing threads to handle other work and improving overall system throughput.<\/p>\n<hr data-start=\"1416\" data-end=\"1419\" \/>\n<h2 data-start=\"1421\" data-end=\"1450\">What Is CompletableFuture?<\/h2>\n<p data-start=\"1452\" data-end=\"1549\"><code data-start=\"1452\" data-end=\"1474\">CompletableFuture&lt;T&gt;<\/code> represents a <strong data-start=\"1488\" data-end=\"1536\">future result of an asynchronous computation<\/strong> that can be:<\/p>\n<ul data-start=\"1551\" data-end=\"1670\">\n<li data-start=\"1551\" data-end=\"1571\">\n<p data-start=\"1553\" data-end=\"1571\">Completed manually<\/p>\n<\/li>\n<li data-start=\"1572\" data-end=\"1602\">\n<p data-start=\"1574\" data-end=\"1602\">Chained with dependent tasks<\/p>\n<\/li>\n<li data-start=\"1603\" data-end=\"1632\">\n<p data-start=\"1605\" data-end=\"1632\">Combined with other futures<\/p>\n<\/li>\n<li data-start=\"1633\" data-end=\"1670\">\n<p data-start=\"1635\" data-end=\"1670\">Handled with non-blocking callbacks<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1672\" data-end=\"1761\">Unlike <code data-start=\"1679\" data-end=\"1687\">Future<\/code>, it supports <strong data-start=\"1701\" data-end=\"1733\">functional-style programming<\/strong> and <strong data-start=\"1738\" data-end=\"1760\">reactive pipelines<\/strong>.<\/p>\n<hr data-start=\"1763\" data-end=\"1766\" \/>\n<h2 data-start=\"1768\" data-end=\"1807\">Creating CompletableFuture Instances<\/h2>\n<h3 data-start=\"1809\" data-end=\"1838\">1. Asynchronous Execution<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;String&gt; future =<br \/>\n    CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello Async World\"<\/span>);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<p data-start=\"1950\" data-end=\"2005\">This uses the <strong data-start=\"1964\" data-end=\"1993\">ForkJoinPool.commonPool()<\/strong> by default.<\/p>\n<h3 data-start=\"2007\" data-end=\"2037\">2. Using a Custom Executor<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span><span class=\"hljs-type\">ExecutorService<\/span> <span class=\"hljs-variable\">executor<\/span> <span class=\"hljs-operator\">=<\/span> Executors.newFixedThreadPool(<span class=\"hljs-number\">10<\/span>);<\/p>\n<p>CompletableFuture&lt;Integer&gt; future =<br \/>\n    CompletableFuture.supplyAsync(() -&gt; compute(), executor);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<blockquote data-start=\"2212\" data-end=\"2302\">\n<p data-start=\"2214\" data-end=\"2302\">\u2705 Best practice: Always use a custom executor in production systems to avoid contention.<\/p>\n<\/blockquote>\n<hr data-start=\"2304\" data-end=\"2307\" \/>\n<h2 data-start=\"2309\" data-end=\"2344\">Chaining Asynchronous Operations<\/h2>\n<h3 data-start=\"2346\" data-end=\"2382\">thenApply \u2013 Transform the Result<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;Integer&gt; future =<br \/>\n    CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-number\">5<\/span>)<br \/>\n                     .thenApply(result -&gt; result * <span class=\"hljs-number\">2<\/span>);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<h3 data-start=\"2531\" data-end=\"2573\">thenAccept \u2013 Consume Without Returning<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.thenAccept(System.out::println);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<h3 data-start=\"2628\" data-end=\"2662\">thenRun \u2013 Execute Side Effects<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.thenRun(() -&gt; logCompletion());<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<hr data-start=\"2716\" data-end=\"2719\" \/>\n<h2 data-start=\"2721\" data-end=\"2761\">Composing Multiple CompletableFutures<\/h2>\n<h3 data-start=\"2763\" data-end=\"2814\">thenCompose \u2013 Flatten Asynchronous Dependencies<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;User&gt; userFuture =<br \/>\n    getUserId()<br \/>\n        .thenCompose(<span class=\"hljs-built_in\">this<\/span>::fetchUserDetails);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<p data-start=\"2928\" data-end=\"3000\">Use <code data-start=\"2932\" data-end=\"2945\">thenCompose<\/code> when the <strong data-start=\"2955\" data-end=\"2999\">next step depends on the previous result<\/strong>.<\/p>\n<hr data-start=\"3002\" data-end=\"3005\" \/>\n<h3 data-start=\"3007\" data-end=\"3051\">thenCombine \u2013 Parallel Independent Tasks<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;String&gt; combined =<br \/>\n    future1.thenCombine(future2, (a, b) -&gt; a + b);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<p data-start=\"3154\" data-end=\"3215\">Ideal for parallel service calls or independent computations.<\/p>\n<hr data-start=\"3217\" data-end=\"3220\" \/>\n<h2 data-start=\"3222\" data-end=\"3256\">Running Multiple Tasks Together<\/h2>\n<h3 data-start=\"3258\" data-end=\"3288\">allOf \u2013 Wait for All Tasks<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;Void&gt; all =<br \/>\n    CompletableFuture.allOf(f1, f2, f3);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<h3 data-start=\"3374\" data-end=\"3406\">anyOf \u2013 First Completed Task<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>CompletableFuture&lt;Object&gt; any =<br \/>\n    CompletableFuture.anyOf(f1, f2, f3);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<hr data-start=\"3494\" data-end=\"3497\" \/>\n<h2 data-start=\"3499\" data-end=\"3531\">Exception Handling Strategies<\/h2>\n<h3 data-start=\"3533\" data-end=\"3572\">exceptionally \u2013 Recover from Errors<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.exceptionally(ex -&gt; {<br \/>\n    log.error(<span class=\"hljs-string\">\"Error occurred\"<\/span>, ex);<br \/>\n    <span class=\"hljs-keyword\">return<\/span> fallbackValue;<br \/>\n});<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<h3 data-start=\"3683\" data-end=\"3729\">handle \u2013 Unified Success and Failure Logic<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.handle((result, ex) -&gt; {<br \/>\n    <span class=\"hljs-keyword\">if<\/span> (ex != <span class=\"hljs-literal\">null<\/span>) <span class=\"hljs-keyword\">return<\/span> defaultValue;<br \/>\n    <span class=\"hljs-keyword\">return<\/span> result;<br \/>\n});<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<hr data-start=\"3840\" data-end=\"3843\" \/>\n<h2 data-start=\"3845\" data-end=\"3873\">Timeouts and Cancellation<\/h2>\n<h3 data-start=\"3875\" data-end=\"3898\">orTimeout (Java 9+)<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.orTimeout(<span class=\"hljs-number\">2<\/span>, TimeUnit.SECONDS);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<h3 data-start=\"3952\" data-end=\"3973\">completeOnTimeout<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.completeOnTimeout(<span class=\"hljs-string\">\"default\"<\/span>, <span class=\"hljs-number\">2<\/span>, TimeUnit.SECONDS);<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<hr data-start=\"4046\" data-end=\"4049\" \/>\n<h2 data-start=\"4051\" data-end=\"4101\">Blocking vs Non-Blocking (Critical Distinction)<\/h2>\n<p data-start=\"4103\" data-end=\"4117\">Avoid calling:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span>future.get();<br \/>\nfuture.join();<br \/>\n<\/span><\/code><\/div>\n<\/div>\n<p data-start=\"4161\" data-end=\"4184\">inside async pipelines.<\/p>\n<blockquote data-start=\"4186\" data-end=\"4290\">\n<p data-start=\"4188\" data-end=\"4290\">\u274c Blocking defeats the purpose of asynchronous programming<br data-start=\"4246\" data-end=\"4249\" \/>\u2705 Use callbacks and composition instead<\/p>\n<\/blockquote>\n<hr data-start=\"4292\" data-end=\"4295\" \/>\n<h2 data-start=\"4297\" data-end=\"4326\">Performance Best Practices<\/h2>\n<h3 data-start=\"4328\" data-end=\"4368\">1. Avoid Common ForkJoinPool for I\/O<\/h3>\n<ul data-start=\"4369\" data-end=\"4448\">\n<li data-start=\"4369\" data-end=\"4410\">\n<p data-start=\"4371\" data-end=\"4410\">Use custom executors for blocking calls<\/p>\n<\/li>\n<li data-start=\"4411\" data-end=\"4448\">\n<p data-start=\"4413\" data-end=\"4448\">Size thread pools based on workload<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"4450\" data-end=\"4477\">2. Keep Pipelines Short<\/h3>\n<ul data-start=\"4478\" data-end=\"4528\">\n<li data-start=\"4478\" data-end=\"4528\">\n<p data-start=\"4480\" data-end=\"4528\">Deep chains reduce readability and debuggability<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"4530\" data-end=\"4565\">3. Handle Exceptions Explicitly<\/h3>\n<ul data-start=\"4566\" data-end=\"4608\">\n<li data-start=\"4566\" data-end=\"4608\">\n<p data-start=\"4568\" data-end=\"4608\">Silent failures are common in async code<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"4610\" data-end=\"4633\">4. Use Immutability<\/h3>\n<ul data-start=\"4634\" data-end=\"4677\">\n<li data-start=\"4634\" data-end=\"4677\">\n<p data-start=\"4636\" data-end=\"4677\">Prevent race conditions in shared objects<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"4679\" data-end=\"4682\" \/>\n<h2 data-start=\"4684\" data-end=\"4723\">CompletableFuture vs ExecutorService<\/h2>\n<div class=\"TyagGW_tableContainer\">\n<div class=\"group TyagGW_tableWrapper flex flex-col-reverse w-fit\" tabindex=\"-1\">\n<table data-start=\"4725\" data-end=\"4960\" class=\"w-fit min-w-(--thread-content-width)\">\n<thead data-start=\"4725\" data-end=\"4774\">\n<tr data-start=\"4725\" data-end=\"4774\">\n<th data-start=\"4725\" data-end=\"4735\" data-col-size=\"sm\">Feature<\/th>\n<th data-start=\"4735\" data-end=\"4753\" data-col-size=\"sm\">ExecutorService<\/th>\n<th data-start=\"4753\" data-end=\"4774\" data-col-size=\"sm\">CompletableFuture<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"4821\" data-end=\"4960\">\n<tr data-start=\"4821\" data-end=\"4848\">\n<td data-start=\"4821\" data-end=\"4832\" data-col-size=\"sm\">Chaining<\/td>\n<td data-col-size=\"sm\" data-start=\"4832\" data-end=\"4839\">\u274c No<\/td>\n<td data-col-size=\"sm\" data-start=\"4839\" data-end=\"4848\">\u2705 Yes<\/td>\n<\/tr>\n<tr data-start=\"4849\" data-end=\"4884\">\n<td data-start=\"4849\" data-end=\"4868\" data-col-size=\"sm\">Functional style<\/td>\n<td data-col-size=\"sm\" data-start=\"4868\" data-end=\"4875\">\u274c No<\/td>\n<td data-col-size=\"sm\" data-start=\"4875\" data-end=\"4884\">\u2705 Yes<\/td>\n<\/tr>\n<tr data-start=\"4885\" data-end=\"4923\">\n<td data-start=\"4885\" data-end=\"4902\" data-col-size=\"sm\">Error handling<\/td>\n<td data-col-size=\"sm\" data-start=\"4902\" data-end=\"4911\">Manual<\/td>\n<td data-col-size=\"sm\" data-start=\"4911\" data-end=\"4923\">Built-in<\/td>\n<\/tr>\n<tr data-start=\"4924\" data-end=\"4960\">\n<td data-start=\"4924\" data-end=\"4938\" data-col-size=\"sm\">Composition<\/td>\n<td data-col-size=\"sm\" data-start=\"4938\" data-end=\"4948\">Limited<\/td>\n<td data-col-size=\"sm\" data-start=\"4948\" data-end=\"4960\">Powerful<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr data-start=\"4962\" data-end=\"4965\" \/>\n<h2 data-start=\"4967\" data-end=\"4990\">Real-World Use Cases<\/h2>\n<ul data-start=\"4992\" data-end=\"5138\">\n<li data-start=\"4992\" data-end=\"5017\">\n<p data-start=\"4994\" data-end=\"5017\">Parallel REST API calls<\/p>\n<\/li>\n<li data-start=\"5018\" data-end=\"5048\">\n<p data-start=\"5020\" data-end=\"5048\">Asynchronous database access<\/p>\n<\/li>\n<li data-start=\"5049\" data-end=\"5080\">\n<p data-start=\"5051\" data-end=\"5080\">Non-blocking event processing<\/p>\n<\/li>\n<li data-start=\"5081\" data-end=\"5109\">\n<p data-start=\"5083\" data-end=\"5109\">Microservice orchestration<\/p>\n<\/li>\n<li data-start=\"5110\" data-end=\"5138\">\n<p data-start=\"5112\" data-end=\"5138\">Background data enrichment<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"5140\" data-end=\"5143\" \/>\n<h2 data-start=\"5145\" data-end=\"5181\">When Not to Use CompletableFuture<\/h2>\n<ul data-start=\"5183\" data-end=\"5307\">\n<li data-start=\"5183\" data-end=\"5212\">\n<p data-start=\"5185\" data-end=\"5212\">CPU-bound tasks without I\/O<\/p>\n<\/li>\n<li data-start=\"5213\" data-end=\"5246\">\n<p data-start=\"5215\" data-end=\"5246\">Simple one-off background tasks<\/p>\n<\/li>\n<li data-start=\"5247\" data-end=\"5307\">\n<p data-start=\"5249\" data-end=\"5307\">Highly reactive streams (consider Project Reactor instead)<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"5309\" data-end=\"5312\" \/>\n<h2 data-start=\"5314\" data-end=\"5327\">Conclusion<\/h2>\n<p data-start=\"5329\" data-end=\"5482\"><code data-start=\"5329\" data-end=\"5348\">CompletableFuture<\/code> is not just a replacement for <code data-start=\"5379\" data-end=\"5387\">Future<\/code>; it is a <strong data-start=\"5397\" data-end=\"5415\">paradigm shift<\/strong> in how Java handles concurrency. When used correctly, it leads to:<\/p>\n<ul data-start=\"5484\" data-end=\"5540\">\n<li data-start=\"5484\" data-end=\"5498\">\n<p data-start=\"5486\" data-end=\"5498\">Cleaner code<\/p>\n<\/li>\n<li data-start=\"5499\" data-end=\"5519\">\n<p data-start=\"5501\" data-end=\"5519\">Better performance<\/p>\n<\/li>\n<li data-start=\"5520\" data-end=\"5540\">\n<p data-start=\"5522\" data-end=\"5540\">Higher scalability<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"5542\" data-end=\"5630\">Mastering it is essential for any Java developer working on modern, <a href=\"https:\/\/harshad-sonawane.com\/blog\/eventual-consistency-distributed-java-systems\/\">distributed systems<\/a>.<\/p>\n<h2 data-start=\"6238\" data-end=\"6251\">References<\/h2>\n<ul data-start=\"6253\" data-end=\"6516\">\n<li data-start=\"6253\" data-end=\"6342\">\n<p data-start=\"6255\" data-end=\"6342\"><a data-start=\"6255\" data-end=\"6340\" rel=\"noopener\" target=\"_new\" class=\"decorated-link\" href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\">https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html<span aria-hidden=\"true\" class=\"ms-0.5 inline-block align-middle leading-none\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" aria-hidden=\"true\" data-rtl-flip=\"\" class=\"block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]\"><use href=\"\/cdn\/assets\/sprites-core-ihvgg3b1.svg#304883\" fill=\"currentColor\"><\/use><\/svg><\/span><\/a><\/p>\n<\/li>\n<li data-start=\"6343\" data-end=\"6375\">\n<p data-start=\"6345\" data-end=\"6375\"><a data-start=\"6345\" data-end=\"6373\" rel=\"noopener\" target=\"_new\" class=\"decorated-link\" href=\"https:\/\/openjdk.org\/jeps\/266\">https:\/\/openjdk.org\/jeps\/266<span aria-hidden=\"true\" class=\"ms-0.5 inline-block align-middle leading-none\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" aria-hidden=\"true\" data-rtl-flip=\"\" class=\"block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]\"><use href=\"\/cdn\/assets\/sprites-core-ihvgg3b1.svg#304883\" fill=\"currentColor\"><\/use><\/svg><\/span><\/a><\/p>\n<\/li>\n<li data-start=\"6376\" data-end=\"6427\">\n<p data-start=\"6378\" data-end=\"6427\"><a data-start=\"6378\" data-end=\"6425\" rel=\"noopener\" target=\"_new\" class=\"decorated-link\" href=\"https:\/\/www.baeldung.com\/java-completablefuture\">https:\/\/www.baeldung.com\/java-completablefuture<span aria-hidden=\"true\" class=\"ms-0.5 inline-block align-middle leading-none\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" aria-hidden=\"true\" data-rtl-flip=\"\" class=\"block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]\"><use href=\"\/cdn\/assets\/sprites-core-ihvgg3b1.svg#304883\" fill=\"currentColor\"><\/use><\/svg><\/span><\/a><\/p>\n<\/li>\n<li data-start=\"6428\" data-end=\"6516\">\n<p data-start=\"6430\" data-end=\"6516\"><a data-start=\"6430\" data-end=\"6514\" rel=\"noopener\" target=\"_new\" class=\"decorated-link cursor-pointer\">https:\/\/www.oracle.com\/technical-resources\/articles\/java\/architect-asynchronous.html<span aria-hidden=\"true\" class=\"ms-0.5 inline-block align-middle leading-none\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\" height=\"20\" aria-hidden=\"true\" data-rtl-flip=\"\" class=\"block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]\"><use href=\"\/cdn\/assets\/sprites-core-ihvgg3b1.svg#304883\" fill=\"currentColor\"><\/use><\/svg><\/span><\/a><\/p>\n<\/li>\n<\/ul>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"o-typing-delay-100ms ticss-27f7e3e9\"><o-anim-typing>&lt;> <strong>&#8220;Happy developing, one line at a time!&#8221;<\/strong> &lt;\/><\/o-anim-typing><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern applications are expected to be fast, responsive, and capable of handling multiple operations concurrently. In Java, traditional multithreading using Thread, Runnable, and ExecutorService often leads to verbose code, complex error handling, and difficult-to-maintain logic. This is where CompletableFuture, introduced in Java 8, fundamentally changes how we write asynchronous and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":442,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":"","jetpack_publicize_message":"Asynchronous programming is no longer optional in modern Java applications. \ud83d\ude80\nIn my latest blog, I deep dive into CompletableFuture, covering chaining, composition, exception handling, and performance best practices with real-world examples.\nIf you\u2019re building scalable Java systems, this is a must-read.\n\n\ud83d\udc49 #Java #CompletableFuture #Concurrency #AsyncProgramming #BackendDevelopment","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[328,113],"tags":[324,325,106,108,326,327],"class_list":["post-436","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-concurrency-asynchronous-programming-backend-development","category-java-spring-boot-aws-microservices","tag-completablefuture","tag-java-async","tag-java-concurrency","tag-java-performance","tag-multithreading-java","tag-non-blocking-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Asynchronous Programming in Java with CompletableFuture<\/title>\n<meta name=\"description\" content=\"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Asynchronous Programming in Java with CompletableFuture\" \/>\n<meta property=\"og:description\" content=\"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/\" \/>\n<meta property=\"og:site_name\" content=\"&lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-14T05:55:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1408\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"HS\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"HS\" \/>\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\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/\"},\"author\":{\"name\":\"HS\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"headline\":\"Mastering Asynchronous Programming in Java with CompletableFuture\",\"datePublished\":\"2026-03-14T05:55:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/\"},\"wordCount\":477,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"image\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Gemini_Generated_Image_ffsufoffsufoffsu.png\",\"keywords\":[\"CompletableFuture\",\"Java Async\",\"Java Concurrency\",\"Java Performance\",\"Multithreading Java\",\"Non Blocking Java\"],\"articleSection\":[\"Java, Concurrency, Asynchronous Programming, Backend Development\",\"Java, Spring Boot, AWS, Microservices\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/\",\"name\":\"Asynchronous Programming in Java with CompletableFuture\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Gemini_Generated_Image_ffsufoffsufoffsu.png\",\"datePublished\":\"2026-03-14T05:55:00+00:00\",\"description\":\"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#primaryimage\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Gemini_Generated_Image_ffsufoffsufoffsu.png\",\"contentUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Gemini_Generated_Image_ffsufoffsufoffsu.png\",\"width\":1408,\"height\":768,\"caption\":\"Mastering Asynchronous Programming in Java with CompletableFuture\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/mastering-asynchronous-programming-java-completablefuture\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mastering Asynchronous Programming in Java with CompletableFuture\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/\",\"name\":\"Harshad's Dev Diary\",\"description\":\"HARSHAD&#039;s Dev Diary\",\"publisher\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/#\\\/schema\\\/person\\\/d82781218ba30c34fa81b49e8393681e\",\"name\":\"HS\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\",\"width\":400,\"height\":400,\"caption\":\"HS\"},\"logo\":{\"@id\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/harshad-sonawane.com\\\/blog\"],\"url\":\"https:\\\/\\\/harshad-sonawane.com\\\/blog\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Asynchronous Programming in Java with CompletableFuture","description":"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.","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:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/","og_locale":"en_US","og_type":"article","og_title":"Asynchronous Programming in Java with CompletableFuture","og_description":"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.","og_url":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/","og_site_name":"&lt;&gt;HARSHAD&#039;s Dev Diary&lt;\/&gt;","article_published_time":"2026-03-14T05:55:00+00:00","og_image":[{"width":1408,"height":768,"url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png","type":"image\/png"}],"author":"HS","twitter_card":"summary_large_image","twitter_misc":{"Written by":"HS","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#article","isPartOf":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/"},"author":{"name":"HS","@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"headline":"Mastering Asynchronous Programming in Java with CompletableFuture","datePublished":"2026-03-14T05:55:00+00:00","mainEntityOfPage":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/"},"wordCount":477,"commentCount":0,"publisher":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"image":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#primaryimage"},"thumbnailUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png","keywords":["CompletableFuture","Java Async","Java Concurrency","Java Performance","Multithreading Java","Non Blocking Java"],"articleSection":["Java, Concurrency, Asynchronous Programming, Backend Development","Java, Spring Boot, AWS, Microservices"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/","url":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/","name":"Asynchronous Programming in Java with CompletableFuture","isPartOf":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#primaryimage"},"image":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#primaryimage"},"thumbnailUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png","datePublished":"2026-03-14T05:55:00+00:00","description":"Learn how to master asynchronous programming in Java using CompletableFuture with real-world examples, best practices, exception handling, and performance optimization.","breadcrumb":{"@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#primaryimage","url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png","contentUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ffsufoffsufoffsu.png","width":1408,"height":768,"caption":"Mastering Asynchronous Programming in Java with CompletableFuture"},{"@type":"BreadcrumbList","@id":"https:\/\/harshad-sonawane.com\/blog\/mastering-asynchronous-programming-java-completablefuture\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/harshad-sonawane.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mastering Asynchronous Programming in Java with CompletableFuture"}]},{"@type":"WebSite","@id":"https:\/\/harshad-sonawane.com\/blog\/#website","url":"https:\/\/harshad-sonawane.com\/blog\/","name":"Harshad's Dev Diary","description":"HARSHAD&#039;s Dev Diary","publisher":{"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/harshad-sonawane.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/harshad-sonawane.com\/blog\/#\/schema\/person\/d82781218ba30c34fa81b49e8393681e","name":"HS","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","url":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","contentUrl":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg","width":400,"height":400,"caption":"HS"},"logo":{"@id":"https:\/\/harshad-sonawane.com\/blog\/wp-content\/uploads\/2025\/02\/about.jpg"},"sameAs":["https:\/\/harshad-sonawane.com\/blog"],"url":"https:\/\/harshad-sonawane.com\/blog\/author\/admin\/"}]}},"jetpack_publicize_connections":[],"_links":{"self":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/comments?post=436"}],"version-history":[{"count":3,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/436\/revisions"}],"predecessor-version":[{"id":440,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/posts\/436\/revisions\/440"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/media\/442"}],"wp:attachment":[{"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/media?parent=436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/categories?post=436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/harshad-sonawane.com\/blog\/wp-json\/wp\/v2\/tags?post=436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}