In this example, one of the workers becomes Leader and listens on the {@link TaskSet} for - * work. {@link TaskSet} basically acts as the source of input events for the {@link Worker}, who - * are spawned and controlled by the {@link WorkCenter} . When {@link Task} arrives then the leader - * takes the work and calls the {@link TaskHandler}. It also calls the {@link WorkCenter} to - * promotes one of the followers to be the new leader, who can then process the next work and so on. - * - *
The pros for this pattern are: It enhances CPU cache affinity and eliminates unbound
- * allocation and data buffer sharing between threads by reading the request into buffer space
- * allocated on the stack of the leader or by using the Thread-Specific Storage pattern [22] to
- * allocate memory. It minimizes locking overhead by not exchanging data between threads, thereby
- * reducing thread synchronization. In bound handle/thread associations, the leader thread
- * dispatches the event based on the I/O handle. It can minimize priority inversion because no extra
- * queuing is introduced in the server. It does not require a context switch to handle each event,
- * reducing the event dispatching latency. Note that promoting a follower thread to fulfill the
- * leader role requires a context switch. Programming simplicity: The Leader/Followers pattern
- * simplifies the programming of concurrency models where multiple threads can receive requests,
- * process responses, and de-multiplex connections using a shared handle set.
- */
+@Slf4j
public class App {
+ private static final Logger log = LoggerFactory.getLogger(App.class);
- /** The main method for the leader followers pattern. */
public static void main(String[] args) throws InterruptedException {
var taskSet = new TaskSet();
var taskHandler = new TaskHandler();
@@ -64,7 +19,6 @@ public static void main(String[] args) throws InterruptedException {
execute(workCenter, taskSet);
}
- /** Start the work, dispatch tasks and stop the thread pool at last. */
private static void execute(WorkCenter workCenter, TaskSet taskSet) throws InterruptedException {
var workers = workCenter.getWorkers();
var exec = Executors.newFixedThreadPool(workers.size());
@@ -75,14 +29,13 @@ private static void execute(WorkCenter workCenter, TaskSet taskSet) throws Inter
addTasks(taskSet);
boolean terminated = exec.awaitTermination(2, TimeUnit.SECONDS);
if (!terminated) {
- System.out.println("Executor did not terminate in the given time.");
+ log.warn("Executor did not terminate in the given time.");
}
} finally {
exec.shutdownNow();
}
}
- /** Add tasks. */
private static void addTasks(TaskSet taskSet) throws InterruptedException {
var rand = new SecureRandom();
for (var i = 0; i < 5; i++) {
From 4ef609c761d94fdc838c546dc8fbdbb258a37ea1 Mon Sep 17 00:00:00 2001
From: 2897robo <2897robo@gmail.com>
Date: Wed, 9 Apr 2025 14:16:52 +0900
Subject: [PATCH 3/3] fix: add missing logger definition for SLF4J
---
leader-followers/pom.xml | 6 ------
.../src/main/java/com/iluwatar/leaderfollowers/App.java | 5 +----
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/leader-followers/pom.xml b/leader-followers/pom.xml
index bb63b9d4c573..12152cd3fc26 100644
--- a/leader-followers/pom.xml
+++ b/leader-followers/pom.xml
@@ -47,12 +47,6 @@