half-sync-half-async pattern need to enhance
In the App class of half-sync-half-async pattern, the workers in threadpool is still running when the main thread has finished. This also makes the AppTest less effective (after the test, we expect to see task results, but we get nothing because junit will terminate jvm when the main thread has finished).  
To improve on it, we can add a close method to the AsynchronousService class and call the method at the end of the main thread. I can create a PR, if needed.
half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java
half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java
diff --git a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java
index 90cb5ecbfb0d..b24e29b6a55c 100644
--- a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java
+++ b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/App.java
@@ -94,6 +94,8 @@ public static void main(String[] args) {
     service.execute(new ArithmeticSumTask(500));
     service.execute(new ArithmeticSumTask(2000));
     service.execute(new ArithmeticSumTask(1));
+
+    service.close();
   }
 
   /**
diff --git a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java
index 4e2f9c23a6cd..3e64edd9894c 100644
--- a/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java
+++ b/half-sync-half-async/src/main/java/com/iluwatar/halfsynchalfasync/AsynchronousService.java
@@ -22,6 +22,9 @@
  */
 package com.iluwatar.halfsynchalfasync;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -38,6 +41,7 @@
  */
 public class AsynchronousService {
 
+  private static final Logger LOGGER = LoggerFactory.getLogger(AsynchronousService.class);
   /*
    * This represents the queuing layer as well as synchronous layer of the pattern. The thread pool
    * contains worker threads which execute the tasks in blocking/synchronous manner. Long running
@@ -95,4 +99,16 @@ protected void done() {
       }
     });
   }
+
+  /**
+   * Stops the pool of workers. This is a blocking call to wait for all tasks to be completed.
+   */
+  public void close() {
+    service.shutdown();
+    try {
+      service.awaitTermination(10, TimeUnit.SECONDS);
+    } catch (InterruptedException ie) {
+      LOGGER.error("Error waiting for executor service shutdown!");
+    }
+  }
 }
