package me.test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class MyAsynEventManager implements Runnable { private List<MyEventListener> repository = new ArrayList<MyEventListener>(); private BlockingQueue<MyEvent> eventQueue = new LinkedBlockingQueue<MyEvent>(1000); private ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 10, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>()); public void addEventListener(MyEventListener listener) { repository.add(listener); } public void removeEventListener(MyEventListener listener) { repository.remove(listener); } public void fire(MyEvent event) { try { eventQueue.put(event); } catch (InterruptedException e) { throw new RuntimeException(e); } } public void run() { while (true) { MyEvent event; try { event = eventQueue.take(); for (MyEventListener listener : repository) { executor.execute(new MyListenerExecutor(listener, event)); } } catch (InterruptedException e) { throw new RuntimeException(e); } } } public static class MyListenerExecutor implements Runnable { private MyEventListener listener; private MyEvent event; public MyListenerExecutor(MyEventListener listener, MyEvent event) { this.listener = listener; this.event = event; } public MyEventListener getListener() { return this.listener; } public MyEvent getEvent() { return event; } public void run() { listener.handle(event); } } }