From 712e8b89e23f565b4d1c54d6db60f3d632ed0d45 Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Thu, 13 Jul 2023 19:07:35 +0100 Subject: [PATCH 1/2] BAEL-6721 Add example code for notification of a complete task --- .../AlertingFutureTask.java | 18 ++++++++ .../AlertingThreadPoolExecutor.java | 21 +++++++++ .../notificationForCompleteTask/Callback.java | 10 +++++ .../CallbackInterface.java | 5 +++ .../RunnableImpl.java | 22 +++++++++ .../notificationForCompleteTask/Task.java | 9 ++++ ...NotificationsForCompleteTasksUnitTest.java | 45 +++++++++++++++++++ 7 files changed, 130 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java new file mode 100644 index 0000000000..43e15e0dc1 --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java @@ -0,0 +1,18 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +import java.util.concurrent.FutureTask; + +public class AlertingFutureTask extends FutureTask { + + private final CallbackInterface callback; + + public AlertingFutureTask(Runnable runnable, Callback callback) { + super(runnable, null); + this.callback = callback; + } + + @Override + protected void done() { + callback.taskDone("task details here"); + } +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java new file mode 100644 index 0000000000..63737f533b --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java @@ -0,0 +1,21 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class AlertingThreadPoolExecutor extends ThreadPoolExecutor { + + private final CallbackInterface callback; + + public AlertingThreadPoolExecutor(CallbackInterface callback) { + super(1, 1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); + this.callback = callback; + } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + callback.taskDone("runnable details here"); + } +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java new file mode 100644 index 0000000000..49ab80ffc8 --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java @@ -0,0 +1,10 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +public class Callback implements CallbackInterface { + + public void taskDone(String details){ + System.out.println("task complete: " + details); + // Alerts/notifications go here + } + +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java new file mode 100644 index 0000000000..201fe1054f --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java @@ -0,0 +1,5 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +public interface CallbackInterface { + void taskDone(String details); +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java new file mode 100644 index 0000000000..886f6f7070 --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java @@ -0,0 +1,22 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +public class RunnableImpl implements Runnable { + + private final Runnable task; + + private final CallbackInterface callback; + + private final String taskDoneMessage; + + public RunnableImpl(Runnable task, CallbackInterface callback, String taskDoneMessage) { + this.task = task; + this.callback = callback; + this.taskDoneMessage = taskDoneMessage; + } + + public void run() { + task.run(); + callback.taskDone(taskDoneMessage); + } + +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java new file mode 100644 index 0000000000..2e723e5b1c --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java @@ -0,0 +1,9 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +public class Task implements Runnable{ + @Override + public void run() { + System.out.println("Task in progress"); + // Business logic goes here + } +} diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java new file mode 100644 index 0000000000..034aa8697a --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.concurrent.notificationForCompleteTask; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; + +import org.junit.Test; + +public class NotificationsForCompleteTasksUnitTest { + + @Test + public void whenImplementingRunnable_thenReceiveNotificationOfCompletedTask() { + Task task = new Task(); + Callback callback = new Callback(); + RunnableImpl runnableImpl = new RunnableImpl(task, callback, "ready for next task"); + runnableImpl.run(); + } + + @Test + public void whenUsingCompletableFuture_thenReceiveNotificationOfCompletedTask() { + Task task = new Task(); + Callback callback = new Callback(); + CompletableFuture.runAsync(task) + .thenAccept(result -> callback.taskDone("completion details: " + result)); + } + + @Test + public void whenUsingThreadPoolExecutor_thenReceiveNotificationOfCompletedTask(){ + Task task = new Task(); + Callback callback = new Callback(); + AlertingThreadPoolExecutor executor = new AlertingThreadPoolExecutor(callback); + executor.submit(task); + } + + @Test + public void whenUsingFutureTask_thenReceiveNotificationOfCompletedTask(){ + Task task = new Task(); + Callback callback = new Callback(); + FutureTask future = new AlertingFutureTask(task, callback); + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.submit(future); + } + +} From 0a8d642f0d0cf5b555af0aaf44a163876a80d264 Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 17 Jul 2023 15:57:24 +0100 Subject: [PATCH 2/2] BAEL-6721 move code to concurrency basic folder --- .../notificationforcompletetask}/AlertingFutureTask.java | 2 +- .../AlertingThreadPoolExecutor.java | 2 +- .../concurrent/notificationforcompletetask}/Callback.java | 2 +- .../notificationforcompletetask}/CallbackInterface.java | 2 +- .../concurrent/notificationforcompletetask}/RunnableImpl.java | 2 +- .../baeldung/concurrent/notificationforcompletetask}/Task.java | 2 +- .../NotificationsForCompleteTasksUnitTest.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/AlertingFutureTask.java (86%) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/AlertingThreadPoolExecutor.java (90%) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/Callback.java (76%) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/CallbackInterface.java (55%) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/RunnableImpl.java (88%) rename core-java-modules/{core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask}/Task.java (73%) rename core-java-modules/{core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask => core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/notificationforcompletetask}/NotificationsForCompleteTasksUnitTest.java (96%) diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingFutureTask.java similarity index 86% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingFutureTask.java index 43e15e0dc1..bd0bacaa3c 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingFutureTask.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingFutureTask.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; import java.util.concurrent.FutureTask; diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingThreadPoolExecutor.java similarity index 90% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingThreadPoolExecutor.java index 63737f533b..029170256f 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/AlertingThreadPoolExecutor.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/AlertingThreadPoolExecutor.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Callback.java similarity index 76% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Callback.java index 49ab80ffc8..fd00a6e116 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Callback.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Callback.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; public class Callback implements CallbackInterface { diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/CallbackInterface.java similarity index 55% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/CallbackInterface.java index 201fe1054f..6df5bc7208 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/CallbackInterface.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/CallbackInterface.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; public interface CallbackInterface { void taskDone(String details); diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/RunnableImpl.java similarity index 88% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/RunnableImpl.java index 886f6f7070..a07254a87f 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/RunnableImpl.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/RunnableImpl.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; public class RunnableImpl implements Runnable { diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Task.java similarity index 73% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Task.java index 2e723e5b1c..601dfd79b8 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/notificationForCompleteTask/Task.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/notificationforcompletetask/Task.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; public class Task implements Runnable{ @Override diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/notificationforcompletetask/NotificationsForCompleteTasksUnitTest.java similarity index 96% rename from core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/notificationforcompletetask/NotificationsForCompleteTasksUnitTest.java index 034aa8697a..f15015da55 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/notificationForCompleteTask/NotificationsForCompleteTasksUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/notificationforcompletetask/NotificationsForCompleteTasksUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.notificationForCompleteTask; +package com.baeldung.concurrent.notificationforcompletetask; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService;