WEB开发网
开发学院软件开发Java Java AIO初探(异步网络IO) 阅读

Java AIO初探(异步网络IO)

 2009-09-22 00:00:00 来源:WEB开发网   
核心提示: 注意到了吧,我们在failed和completed方法中在最后都调用了pendingAccept来继续发起accept调用,Java AIO初探(异步网络IO)(6),等待新的连接上来,有的同学可能要说了,异步IO也同样如此,连接建立后马上发起一个异步read调用,这样搞是不是递归调用,会不会堆

注意到了吧,我们在failed和completed方法中在最后都调用了pendingAccept来继续发起accept调用,等待新的连接上来。有的同学可能要说了,这样搞是不是递归调用,会不会堆栈溢出?实际上不会,因为发起accept调用的线程与CompletionHandler回调的线程并非同一个,不是一个上下文中,两者之间没有耦合关系。要注意到,CompletionHandler的回调共用的是 AsynchronousChannelGroup绑定的线程池,因此千万别在回调方法中调用阻塞或者长时间的操作,例如sleep,回调方法最好能支持超时,防止线程池耗尽。

连接建立后,怎么读和写呢?回忆下在nonblocking nio框架中,连接建立后的第一件事是干什么?注册OP_READ事件等待socket可读。异步IO也同样如此,连接建立后马上发起一个异步read调用,等待socket可读,这个是Session.start方法中所做的事情:

public class AioTCPSession {
    protected void start0() {
        pendingRead();
    }
    protected final void pendingRead() {
        if (!isClosed() && this.asynchronousSocketChannel.isOpen()) {
            if (!this.readBuffer.hasRemaining()) {
                this.readBuffer = ByteBufferUtils
                        .increaseBufferCapatity(this.readBuffer);
            }
            this.readFuture = this.asynchronousSocketChannel.read(
                    this.readBuffer, this, this.readCompletionHandler);
        } else {
            throw new IllegalStateException(
                    "Session Or Channel has been closed");
        }
    }
   
}

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:Java AIO 初探

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接