Java多线程基础总结九:Mina窥探(1)2012-06-25 iteye ftj20003一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说Mina。Apache Mina作为一个高性能的Java异步并发网 络通讯框架,其内部的多线程的设计和实现可谓是学习多线程的良药。手上的Mina源码是svn剪下来的最新的代码,mvn转化成eclipse项目 后导入mina-core的源码看看多线程的应用吧。首先简单的介绍在org.apache.mina.core.service包里的核心接口之一:IoService。这个接口是对于服务器端接收连接和客户端发起连 接这两种服务的顶层抽象,所以就有了IoAcceptor和IoConnector两个子接口的继承与隔离。很拍马屁的说,从这个小细节可以看到mina架 构的精细。这种程度的接口的隔离最重要的就是对接口内抽象行为的准确划分,错误的划分接口的职责将使得后面得实现显得不合理甚至是 错误。只是不知道负责抽象的设计人员是否是一次性的抽象成功,如果是只能说牛x。至于交互会话IoSession和实际的I/O操作处理器 IoProcessor 以及底层处理I/O事件的IoHandle这些接口就不废话了,今天看的是与IoServiceListener有关的多线程应用。 IoServiceListener主要是用来监听IoService相关的事件,而今日主角--IoServiceListenerSupport则是用来把IoService和对应的 IoServiceListener包装在一起进行管理的辅助类。先看看其源码:Java代码public class IoServiceListenerSupport { /** The {@link IoService} that this instance manages. */ private final IoService service;
/** A list of {@link IoServiceListener}s. */ private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener> ();
/** Tracks managed sessions. */ private final ConcurrentMap<Long, IoSession> managedSessions = new ConcurrentHashMap<Long, IoSession>();
/** Read only version of {@link #managedSessions}. */ private final Map<Long, IoSession> readOnlyManagedSessions = Collections.unmodifiableMap (managedSessions);
private final AtomicBoolean activated = new AtomicBoolean();
/** Time this listenerSupport has been activated */ private volatile long activationTime;
/** A counter used to store the maximum sessions we managed since the listenerSupport has been activated */ private volatile int largestManagedSessionCount = 0;
/** A global counter to count the number of sessions managed since the start */ private volatile long cumulativeManagedSessionCount = 0;
/** * Adds a new listener. * * @param listener The added listener */ public void add(IoServiceListener listener) { if (listener != null) { listeners.add(listener); } }
/** * @return true if the instance is active */ public boolean isActive() { return activated.get(); }
/** * Calls {@link IoServiceListener#serviceActivated(IoService)} * for all registered listeners. */ public void fireServiceActivated() { if (!activated.compareAndSet(false, true)) { // The instance is already active return; }
activationTime = System.currentTimeMillis();
// Activate all the listeners now for (IoServiceListener listener : listeners) { try { listener.serviceActivated(service); } catch (Throwable e) { ExceptionMonitor.getInstance().exceptionCaught(e); } } }
/** * Calls {@link IoServiceListener#sessionCreated(IoSession)} for all registered listeners. * * @param session The session which has been created */ public void fireSessionCreated(IoSession session) { boolean firstSession = false;