java mina多线程_Java多线程基础总结九:Mina窥探(1)

一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说Mina。Apache Mina作为一个高性能的Java异步并发网 络通讯框架,其内部的多线程的设计和实现可谓是学习多线程的良药。手上的Mina源码是svn剪下来的最新的代码,mvn转化成eclipse项

一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说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 Listlisteners = new CopyOnWriteArrayList();

/** Tracks managed sessions. */

private final ConcurrentMapmanagedSessions = new ConcurrentHashMap();

/** Read only version of {@link #managedSessions}. */

private final MapreadOnlyManagedSessions = 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;

if (session.getService() instanceof IoConnecTor) {

synchronized (managedSessions) {

firstSession = managedSessions.isEmpty();

}

}

...

cumulativeManagedSessionCount ++;

...

}

}

这里为了说明多线程的应用,我仅仅节选相关的方法和方法片段。从这个类中我们还是能看到丰富的多线程的应用的。下面就开始这盘 菜吧!

首先从全局变量开始看看:CopyOnWriteArrayList,ConcurrentMap,AtomicBoolean,volatile堪称多线程小动员了。后两者之前都有 介绍暂时省略,后面的方法分析时会看到使用情景。前两者都是java.util.concurrent包下的并发集合框架成员。ConcurrentMap是高效的 并发Map实现,主要是采取分段加锁的机制,默认是16段锁,所以多线程的竞争大大的降低。只

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值