@@ -0,0 +1,1441 @@
+package net.michaelsavich.notification;%0A%0Aimport java.util.HashSet;%0Aimport java.util.concurrent.ExecutorService;%0Aimport java.util.concurrent.Executors;%0Aimport static java.lang.Runtime.getRuntime;%0A%0A/**%0A * An instance of NotificationCenter that dispatches %7B@link Notification notifications%7D to their %7B@link NotificationObserver observers%7D concurrently.%0A * Note that an instance of this object is returned by the static method %7B@link NotificationCenter#primaryAsync()%7D. This class is exposed as public primarily because it%0A * may be useful to subclass AsynchronousNotificationCenter to implement custom bookkeeping. Furthermore, if for some reason you don't want to use%0A * the singleton-like behavior of the static methods in NotificationCenter, you can instantiate this class directly and manage it yourself.%0A */%0A%0Apublic class AsynchronousNotificationCenter extends NotificationCenter %7B%0A%0A%09/**%0A%09 * %7B@inheritDoc%7D%0A%09 * %3Cp%3E%0A%09 * The implementation of this method provided by AsynchronousNotificationCenter is asynchronous.%0A%09 * %3C/p%3E%0A%09 * %3Cp%3E%0A%09 * When calling this method, remember that no guarantee is made regarding the order in which  are notified.%0A%09 * %3C/p%3E%0A%09 */%0A%09@Override%0A%09public void post(Notification notification) %7B%0A%09%09dispatchTable.getOrDefault(notification.getName(), new HashSet%3C%3E())%0A%09%09%09%09.forEach((o) -%3E o.receiveNotification(notification));%0A%0A%09%7D%0A%09private ExecutorService ex = Executors.newFixedThreadPool(getRuntime().availableProcessors());%0A%7D

Add AsynchronousNotificationCenter.java