ServerSocketChannel 只能把OP_ACCEPT注册到某个Selector上,不能注册OP_CONNENCT,OP_READ,OP_WRITE事件;
而SocketChannel 恰恰相反,它能注册OP_CONNENCT,OP_READ,OP_WRITE事件,不能注册OP_ACCEPT。
但是,将某种Channel注册到某个Selector的操作绝大多数都是一样的,也就是说我们可以在超类中实现这些东西。
Bad smells in code中有提过“Duplicated code”,其中一种情况就是重复的代码出现在两个兄弟类中,我们应该把
共同的部分Pull up到超类中去,对于他们之间的不同部分,应该单独出来,细化成某个粒度更小的接口或抽象方法,以在
不同子类中不同实现。
SuperClass {
protected abstart void diffPart();
public void operation() {
//共同操作
diffPart();
//共同操作
}
}
SubClassOne {
public void diffPart() {
//subClassOne's part
}
}
SubClassTwo {
public void diffPart() {
//subClassTwo's part
}
}
public abstract int validOps();//超类中细粒度的抽象方法
public final SelectionKey register(Selector sel, int ops,
Object att)
throws ClosedChannelException
{
if (!isOpen())
throw new ClosedChannelException();
if ((ops & ~validOps()) != 0)//各个子类不同的部分
throw new IllegalArgumentException();
synchronized (regLock) {
if (blocking)
throw new IllegalBlockingModeException();
SelectionKey k = findKey(sel);
if (k != null) {
k.interestOps(ops);
k.attach(att);
}
if (k == null) {
// New registration
k = ((AbstractSelector)sel).register(this, ops, att);
addKey(k);
}
return k;
}
}
子类 SocketChannel的实现:
/**
* Returns an operation set identifying this channel's supported
* operations.
*
* <p> Socket channels support connecting, reading, and writing, so this
* method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT}
* <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link
* SelectionKey#OP_WRITE}<tt>)</tt>. </p>
*
* @return The valid-operation set
*/
public final int validOps() {
return (SelectionKey.OP_READ
| SelectionKey.OP_WRITE
| SelectionKey.OP_CONNECT);
}
子类ServerSocketChannel的实现:
/**
* Returns an operation set identifying this channel's supported
* operations.
*
* <p> Server-socket channels only support the accepting of new
* connections, so this method returns {@link SelectionKey#OP_ACCEPT}.
* </p>
*
* @return The valid-operation set
*/
public final int validOps() {
return SelectionKey.OP_ACCEPT;
}
分享到:
相关推荐
Maven坐标:org.jboss.xnio:xnio-nio:3.8.0.Final; 标签:jboss、xnio、nio、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:org.jboss.xnio:xnio-nio:3.8.4.Final; 标签:jboss、xnio、nio、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...
Maven坐标:org.jboss.xnio:xnio-nio:3.8.4.Final; 标签:jboss、xnio、nio、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...
Maven坐标:org.jboss.xnio:xnio-nio:3.8.0.Final; 标签:jboss、xnio、nio、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...
11丨答疑课堂:深入了解NIO的优化实现原理.html
Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析 IO模型在计算机编程中扮演着至关重要的角色,特别是在网络通信中。Java提供了三种主要的IO模型:BIO(Blocking IO),NIO(Non-blocking IO),...
... 赠送源代码:httpcore-nio-4.4.14-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.14;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
`java.nio.file.Paths`模块提供静态方法创建`Path`对象,代表文件系统中的路径。`Path`类则包含一系列方法,用于处理和操作路径。例如: ```java import java.nio.file.Path; import java.nio.file.Paths; public ...
... 赠送源代码:httpcore-nio-4.4.6-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
nio java8 nio使用的总结 目录 1. NIO_NIO 与 IO 区别 NIO支持面向缓冲区的、基于通道的IO操作 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(NonBlocking ...
... 赠送源代码:httpcore-nio-4.4.12-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.12;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:... ... 赠送源代码:httpcore-nio-4.4.5-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.5;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
本篇文章将深入探讨Java技术栈中的关键概念:JVM(Java虚拟机)、NIO(非阻塞I/O)、并发编程、MySQL数据库、数据库分库分表、微服务以及分布式缓存。 首先,JVM是Java程序运行的基础,它负责解释和执行Java字节码...
... 赠送源代码:httpcore-nio-4.4.10-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.10;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:httpcore-nio-4.4.6.jar 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar 赠送源代码:httpcore-nio-4.4.6-sources.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
2. **缓冲区(Buffer)**:缓冲区是NIO的核心,它在内存中分配一块区域来存储数据。在进行IO操作时,数据先被存入缓冲区,然后再从缓冲区读取。Buffer类提供了诸如capacity(容量)、limit(限制)和position(位置)...
... 赠送源代码:httpcore-nio-4.4.10-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。