{"id":229,"date":"2024-02-09T23:29:05","date_gmt":"2024-02-09T22:29:05","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=229"},"modified":"2024-02-23T23:32:11","modified_gmt":"2024-02-23T22:32:11","slug":"completablefuture-in-java-ein-ueberblick","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=229","title":{"rendered":"CompletableFuture in Java &#8211; ein \u00dcberblick"},"content":{"rendered":"\n<p>Die <code>CompletableFuture<\/code>-Klasse wurde mit Java 8 eingef\u00fchrt und hat die Art und Weise, wie Entwickler asynchrone Programmierung in Java angehen, grundlegend ver\u00e4ndert. Diese Klasse bietet eine m\u00e4chtige und flexible API f\u00fcr die asynchrone Programmierung und erm\u00f6glicht es Entwicklern, komplexe Aufgaben effizient zu parallelisieren. In diesem Artikel werden wir die <code>CompletableFuture<\/code>-Klasse in Java im Detail untersuchen, ihre Funktionalit\u00e4ten, Anwendungsf\u00e4lle und bew\u00e4hrte Praktiken kennenlernen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Einf\u00fchrung in CompletableFuture<\/h2>\n\n\n\n<p>Die <code>CompletableFuture<\/code>-Klasse geh\u00f6rt zum <code>java.util.concurrent<\/code>-Paket und basiert auf dem Future-Pattern. Sie erweitert das traditionelle <code>Future<\/code>-Konzept, indem sie Funktionalit\u00e4ten f\u00fcr asynchrone Operationen und Verkn\u00fcpfung von Futures bereitstellt. Ein <code>CompletableFuture<\/code> repr\u00e4sentiert eine potenziell abgeschlossene Berechnung und erm\u00f6glicht es, Callbacks zu registrieren, die automatisch aufgerufen werden, wenn die Berechnung abgeschlossen ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Grundlegende Verwendung von CompletableFuture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. Erstellen von CompletableFuture<\/h3>\n\n\n\n<p>Ein <code>CompletableFuture<\/code> kann auf verschiedene Arten erstellt werden. Eine h\u00e4ufige Methode ist <code>CompletableFuture.supplyAsync<\/code>, die eine Berechnung asynchron ausf\u00fchrt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello, CompletableFuture\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.2. Kombination von CompletableFuture<\/h3>\n\n\n\n<p><code>CompletableFuture<\/code> erm\u00f6glicht die Verkn\u00fcpfung von mehreren Futures, um komplexe Abl\u00e4ufe zu erstellen. Zum Beispiel k\u00f6nnen wir zwei <code>CompletableFuture<\/code>-Objekte kombinieren und eine Aktion ausf\u00fchren, wenn beide abgeschlossen sind:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>);\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"CompletableFuture\"<\/span>);\n\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; combinedFuture = future1.thenCombine(future2, (result1, result2) -&gt; result1 + <span class=\"hljs-string\">\" \"<\/span> + result2);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Verkettung von CompletableFuture<\/h2>\n\n\n\n<p>Eine der leistungsstarken Funktionen von <code>CompletableFuture<\/code> ist die M\u00f6glichkeit, Aktionen zu verketten, die sequentiell oder parallel ausgef\u00fchrt werden k\u00f6nnen. Dies wird durch Methoden wie <code>thenApply<\/code>, <code>thenAccept<\/code>, und <code>thenCompose<\/code> erm\u00f6glicht.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; originalFuture = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>);\n\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; chainedFuture = originalFuture\n    .thenApply(result -&gt; result + <span class=\"hljs-string\">\", World\"<\/span>)\n    .thenApply(<span class=\"hljs-built_in\">String<\/span>::toUpperCase)\n    .thenAccept(System.out::println);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Ausnahmebehandlung mit CompletableFuture<\/h2>\n\n\n\n<p>Die <code>CompletableFuture<\/code>-Klasse erm\u00f6glicht auch eine effektive Behandlung von Ausnahmen. Sie k\u00f6nnen die <code>exceptionally<\/code>-Methode verwenden, um einen Fehler abzufangen und einen Standardwert oder ein Ersatzergebnis bereitzustellen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future = CompletableFuture.supplyAsync(() -&gt; {\n    <span class=\"hljs-comment\">\/\/ Simulieren einer Ausnahme<\/span>\n    <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Oops! Something went wrong\"<\/span>);\n});\n\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; result = future.exceptionally(ex -&gt; <span class=\"hljs-string\">\"Default Value\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Parallele Ausf\u00fchrung mit CompletableFuture<\/h2>\n\n\n\n<p>Ein entscheidender Vorteil von <code>CompletableFuture<\/code> besteht darin, dass es einfach ist, Aufgaben parallel auszuf\u00fchren. Durch die Verwendung von Methoden wie <code>thenCombine<\/code> und <code>thenAcceptBoth<\/code> k\u00f6nnen Sie Ergebnisse von mehreren Futures kombinieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>);\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"CompletableFuture\"<\/span>);\n\nCompletableFuture&lt;Void&gt; combinedFuture = future1.thenAcceptBoth(future2, (result1, result2) -&gt; {\n    System.out.println(result1 + <span class=\"hljs-string\">\" \"<\/span> + result2);\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. Timeout und Abbruch von CompletableFuture<\/h2>\n\n\n\n<p>Mit <code>CompletableFuture<\/code> k\u00f6nnen Sie auch einen Timeout f\u00fcr eine Operation festlegen und eine alternative Aktion ausf\u00fchren, wenn die Operation nicht innerhalb eines bestimmten Zeitrahmens abgeschlossen wird:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future = CompletableFuture.supplyAsync(() -&gt; {\n    <span class=\"hljs-comment\">\/\/ Simuliere eine lang andauernde Operation<\/span>\n    <span class=\"hljs-keyword\">try<\/span> {\n        Thread.sleep(<span class=\"hljs-number\">5000<\/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\">\"Hello\"<\/span>;\n});\n\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; result = future.orTimeout(<span class=\"hljs-number\">3<\/span>, TimeUnit.SECONDS)\n    .exceptionally(ex -&gt; <span class=\"hljs-string\">\"Operation timed out\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. CompletableFuture und CompletableFuture.allOf<\/h2>\n\n\n\n<p>Wenn Sie eine Gruppe von <code>CompletableFuture<\/code>-Objekten haben und warten m\u00f6chten, bis alle abgeschlossen sind, k\u00f6nnen Sie die <code>CompletableFuture.allOf<\/code>-Methode verwenden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future1 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Hello\"<\/span>);\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future2 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"CompletableFuture\"<\/span>);\nCompletableFuture&lt;<span class=\"hljs-built_in\">String<\/span>&gt; future3 = CompletableFuture.supplyAsync(() -&gt; <span class=\"hljs-string\">\"Java\"<\/span>);\n\nCompletableFuture&lt;Void&gt; allOfFuture = CompletableFuture.allOf(future1, future2, future3);\n\n<span class=\"hljs-comment\">\/\/ Warten, bis alle abgeschlossen sind<\/span>\nallOfFuture.join();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Fazit<\/h2>\n\n\n\n<p>Die <code>CompletableFuture<\/code>-Klasse in Java bietet eine leistungsstarke M\u00f6glichkeit, asynchrone Programmierung durchzuf\u00fchren. Von der einfachen Parallelisierung von Aufgaben bis hin zur komplexen Verkettung von Aktionen und der effektiven Behandlung von Ausnahmen bietet diese Klasse eine F\u00fclle von Funktionen. Es ist wichtig, die API gr\u00fcndlich zu verstehen und bew\u00e4hrte Praktiken zu beachten, um sicherzustellen, dass Sie das volle Potenzial von <code>CompletableFuture<\/code> nutzen und robusten, wartbaren Code schreiben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die CompletableFuture-Klasse wurde mit Java 8 eingef\u00fchrt und hat die Art und Weise, wie Entwickler asynchrone Programmierung in Java angehen, grundlegend ver\u00e4ndert. Diese Klasse bietet eine m\u00e4chtige und flexible API f\u00fcr die asynchrone Programmierung und erm\u00f6glicht es Entwicklern, komplexe Aufgaben effizient zu parallelisieren. In diesem Artikel werden wir die CompletableFuture-Klasse in Java im Detail untersuchen, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-229","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=229"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":230,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/229\/revisions\/230"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}