From 1d289c30b991c4424b7fac1cb1a250dd4e73c921 Mon Sep 17 00:00:00 2001
From: Wynn Teo <49014791+wynnteo@users.noreply.github.com>
Date: Thu, 21 Mar 2024 09:22:00 +0800
Subject: [PATCH] Bael 7641 (#16099)
* BAEL-7490 read write file in separate thread
* Change the to try resources
* Update the code to sync with article
* code demostration for ExecutorService vs CompletableFuture
---
.../core-java-concurrency-advanced-5/pom.xml | 4 +-
.../CompletableFutureDemo.java | 64 ++++++++++++
.../ExecutorServiceDemo.java | 98 +++++++++++++++++++
3 files changed, 164 insertions(+), 2 deletions(-)
create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/CompletableFutureDemo.java
create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/ExecutorServiceDemo.java
diff --git a/core-java-modules/core-java-concurrency-advanced-5/pom.xml b/core-java-modules/core-java-concurrency-advanced-5/pom.xml
index 4f681367e9..9caa943a57 100644
--- a/core-java-modules/core-java-concurrency-advanced-5/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-5/pom.xml
@@ -28,8 +28,8 @@
- 1.8
- 1.8
+ 9
+ 9
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/CompletableFutureDemo.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/CompletableFutureDemo.java
new file mode 100644
index 0000000000..b45156db15
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/CompletableFutureDemo.java
@@ -0,0 +1,64 @@
+package com.baeldung.executorservicevscompletablefuture;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.TimeUnit;
+
+public class CompletableFutureDemo {
+
+ public static void completableFutureMethod() {
+ CompletableFuture future = CompletableFuture.supplyAsync(() -> {
+ return 42;
+ });
+
+ System.out.println(future.join());
+ }
+
+ public static void chainingTaskExample() {
+ CompletableFuture firstTask = CompletableFuture.supplyAsync(() -> {
+ return 42;
+ });
+
+ CompletableFuture secondTask = firstTask.thenApply(result -> {
+ return "Result based on Task 1: " + result;
+ });
+
+ System.out.println(secondTask.join());
+ }
+
+ public static void exceptionHandlingExample() {
+ CompletableFuture future = CompletableFuture.supplyAsync(() -> {
+ // Simulate a task that might throw an exception
+ if (true) {
+ throw new RuntimeException("Something went wrong!");
+ }
+ return "Success";
+ })
+ .exceptionally(ex -> {
+ System.err.println("Error in task: " + ex.getMessage());
+ // Can optionally return a default value
+ return "Error occurred";
+ });
+
+ future.thenAccept(result -> System.out.println("Result: " + result));
+ }
+
+ public static void timeoutExample() {
+ CompletableFuture future = CompletableFuture.supplyAsync(() -> {
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ System.err.println("Task execution timed out!");
+ }
+ return "Task completed";
+ });
+
+ CompletableFuture timeoutFuture = future.completeOnTimeout("Timed out!", 2, TimeUnit.SECONDS);
+ String result = timeoutFuture.join();
+ System.out.println("Result: " + result);
+ }
+
+ public static void main(String[] args) {
+ timeoutExample();
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/ExecutorServiceDemo.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/ExecutorServiceDemo.java
new file mode 100644
index 0000000000..99ddea9f2b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/executorservicevscompletablefuture/ExecutorServiceDemo.java
@@ -0,0 +1,98 @@
+package com.baeldung.executorservicevscompletablefuture;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+public class ExecutorServiceDemo {
+
+ public static void executorServiceMethod() throws ExecutionException, InterruptedException {
+ ExecutorService executor = Executors.newFixedThreadPool(3);
+ Future future = executor.submit(() -> {
+ return 42;
+ });
+
+ System.out.println(future.get());
+ }
+
+ public static void chainingTaskExample() {
+ ExecutorService executor = Executors.newFixedThreadPool(2);
+ Future firstTask = executor.submit(() -> {return 42;});
+
+ Future secondTask = executor.submit(() -> {
+ try {
+ Integer result = firstTask.get();
+ return "Result based on Task 1: " + result;
+ } catch (InterruptedException | ExecutionException e) {
+ // Handle exception
+ System.err.println("Error occured: " + e.getMessage());
+ }
+ return null;
+ });
+ executor.shutdown();
+
+ try {
+ // Wait for the second task to complete and retrieve the result
+ String result = secondTask.get();
+ System.out.println(result); // Output: Result based on Task 1: 42
+ } catch (InterruptedException | ExecutionException e) {
+ // Handle exception
+ System.err.println("Error occured: " + e.getMessage());
+ }
+ }
+
+ public static void exceptionHandlingExample() {
+ ExecutorService executor = Executors.newFixedThreadPool(2);
+ Future future = executor.submit(() -> {
+ // Simulate a task that might throw an exception
+ if (true) {
+ throw new RuntimeException("Something went wrong!");
+ }
+ return "Success";
+ });
+
+ try {
+ // This might block the main thread if the task throws an exception
+ String result = future.get();
+ System.out.println("Result: " + result);
+ } catch (InterruptedException | ExecutionException e) {
+ // Handle exceptions thrown by the task or during retrieval
+ System.err.println("Error occured: " + e.getMessage());
+ } finally {
+ executor.shutdown();
+ }
+ }
+
+ public static void timeoutExample() {
+ ExecutorService executor = Executors.newFixedThreadPool(2);
+ Future future = executor.submit(() -> {
+ try {
+ System.out.println("Start");
+ Thread.sleep(5000);
+ System.out.println("End");
+ } catch (InterruptedException e) {
+ System.err.println("Error occured: " + e.getMessage());
+ }
+ return "Task completed";
+ });
+
+ try {
+ String result = future.get(2, TimeUnit.SECONDS);
+ System.out.println("Result: " + result);
+ } catch (TimeoutException e) {
+ System.err.println("Task execution timed out!");
+ future.cancel(true);
+ } catch (Exception e) {
+ System.err.println("Error occured: " + e.getMessage());
+ } finally {
+ executor.shutdown();
+ }
+ }
+
+ public static void main(String[] args) throws ExecutionException, InterruptedException {
+ timeoutExample();
+ }
+}