package com.alipay.bluewhale.core.event; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import com.alipay.bluewhale.core.callback.RunnableCallback; import backtype.storm.utils.Time; /** * �¼���������һ���¼����У�����һ���̣߳�ÿ�ζ�����ȥȡ���¼�ִ�С� */ public class EventManagerImp implements EventManager { AtomicInteger added = new AtomicInteger(); AtomicInteger processed = new AtomicInteger(); AtomicBoolean isrunning = new AtomicBoolean(true); Thread runningThread; LinkedBlockingQueue<RunnableCallback> queue = new LinkedBlockingQueue<RunnableCallback>(); public EventManagerImp(boolean _daemon) { Runnable runner = new EventManagerImpExecute(this); runningThread = new Thread(runner); runningThread.setDaemon(_daemon); runningThread.start(); } public boolean isRunning() { return isrunning.get(); } public RunnableCallback take() throws InterruptedException { RunnableCallback event = queue.take(); return event; } public void proccessinc() { processed.incrementAndGet(); } @Override public void add(RunnableCallback event_fn) { if (!this.isRunning()) { throw new RuntimeException( "Cannot add events to a shutdown event manager"); } added.incrementAndGet(); queue.add(event_fn); } @Override public boolean waiting() { return Time.isThreadWaiting(runningThread) || (processed.get() == added.get()); } @Override public void shutdown() { isrunning.set(false); runningThread.interrupt(); try { runningThread.join(); } catch (InterruptedException e) { } } }