asynchronousServerSocketChannel.accept(this,new AcceptCompletionHandler());

的方式接收客户端的连接,那它是怎么做的呢,我们做下源码分析。

这个accept方法进入了实现类

AsynchronousServerSocketChannelImpl的accept方法,如下:


public final <A> void accept(A var1, CompletionHandler<AsynchronousSocketChannel, ? super A> var2) {
if(var2 == null) {
throw new NullPointerException("\'handler\' is null");
} else {
this.implAccept(var1, var2);
}
}
AccessControlContext var5 = System.getSecurityManager() == null?null:AccessController.getContext();
PendingFuture var6 = new PendingFuture(this, var2, var1);
WindowsAsynchronousServerSocketChannelImpl.AcceptTask var7 = new WindowsAsynchronousServerSocketChannelImpl.AcceptTask(var3, var5, var6);
var6.setContext(var7);
if(!this.accepting.compareAndSet(false, true)) {
throw new AcceptPendingException();
} else {
if(Iocp.supportsThreadAgnosticIo()) {
var7.run();
} else {
Invoker.invokeOnThreadInThreadPool(this, var7);
}

return var6;
static <V, A> void invokeUnchecked(CompletionHandler<V, ? super A> var0, A var1, V var2, Throwable var3) {
if(var3 == null) {
var0.completed(var2, var1);
} else {
var0.failed(var3, var1);
}
Thread.interrupted();