From 923744bf618f860bb818cdb1a714f4768997f771 Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Thu, 13 Jul 2023 19:07:35 +0100 Subject: [PATCH] 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); + } + +}