今天一个东西需要用到java nio的东西。在网上查了一下资料。之前看过这部分的内容,但好长一段时间没有用,也就忘得七七八八了。如今是温故而知新,但其中遇到了些疑问:

先贴上代码吧:

public static void main(String[] args) throws Exception{

		Thread sh=new Thread(new Runnable() {
public void run(){
try{
ServerSocket ss=new ServerSocket(3000);
Socket client=ss.accept();
OutputStream os=client.getOutputStream();
while(true){
os.write("Helloworld".getBytes());
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
} }
});
sh.start(); SocketChannel sc=SocketChannel.open();
sc.socket().connect(new InetSocketAddress("localhost",3000) );
sc.configureBlocking(false);
Selector selector=Selector.open();
sc.register(selector,SelectionKey.OP_READ); ByteBuffer byteBuffer=ByteBuffer.allocate(1000);
while(true){
if(selector.select()>0){
Set<SelectionKey> sks=selector.selectedKeys();
Iterator<SelectionKey> it = sks.iterator();
while(it.hasNext()){
                        SelectionKey key=it.next();
if(key.isReadable()){
System.out.println("is Readable() ");
SocketChannel isc=(SocketChannel)key.channel();
isc.read(byteBuffer);
}
it.remove();
}
}
System.out.println("return from select() ");
}
}

  

关于是否需要it.remove()这一行呢。

按照上面运行的结果:

is Readable()
return from select()
is Readable()
return from select()
is Readable()
return from select()
is Readable()
return from select()

然后把sks.remove(key)这一行注释掉,再次运行:

is Readable()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
return from select()
...

说明了,如果不对已经处理完的SelectionKey在selectedKeys中执行remove操作的话。下一次select()操作将会直接返回,但其返回的值是0。Selector类型于“水平触发”,但与水平触发不一样的是,下一次Selector.select的时候,并不会返回上一次没有remove掉的键集。

JAVA NIO中selectedKeys返回的键集,对其中的SelectionKey执行操作之后,是否需要在selectedKeys()中对其执行remove 操作的更多相关文章

  1. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  2. Java MyBatis 插入数据库返回主键--insertSelective这样就不用每次到数据库里面查询了

    insertSelective---Java MyBatis 插入数据库返回主键--insertSelective这样就不用每次到数据库里面查询了 https://www.cnblogs.com/xi ...

  3. Mybatis中insert返回主键ID

    记录解决的过程,这里就不搬砖了. 1.获取insert后的主键id 原文链接:http://www.cnblogs.com/fsjohnhuang/p/4078659.html 2.insert后返回 ...

  4. JAVA NIO学习三:NIO 的非阻塞式网络通信

    紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...

  5. JAVA NIO 简单介绍

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00918492 一:为什么要使用NIO技术        ...

  6. Java NIO简单介绍(二)

    上一篇<NIO简单介绍(一)>中讲解了NIO中本地IO相关的内容,这篇重点介绍的NIO的非阻塞式网络通信 一.阻塞与非阻塞 传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read ...

  7. 【Java NIO】一文了解NIO

    Java NIO 1 背景介绍 在上一篇文章中我们介绍了Java基本IO,也就是阻塞式IO(BIO),在JDK1.4版本后推出了新的IO系统(NIO),也可以理解为非阻塞IO(Non-Blocking ...

  8. java nio使用方法(转)

    最近由于工作关系要做一些Java方面的开发,其中最重要的一块就是Java NIO(New I/O),尽管很早以前了解过一些,但并没有认真去看过它的实现原理,也没有机会在工作中使用,这次也好重新研究一下 ...

  9. 3、谈谈 Java NIO

    在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...

随机推荐

  1. HDU-5532 Almost Sorted Array (LIS)

    题目大意:给一个n个数的序列,问这个序列删掉一个数后是否有序. 题目分析:找最长上升子序列和最长下降子序列,只要有一个的长度不小于n-1即可. 代码如下: # include<iostream& ...

  2. click 绑定(三)防止事件冒泡

     防止事件冒泡 默认情况下,Knockout允许click事件继续在更高一层的事件句柄上冒泡执行.例如,如果你的元素和父元素都绑定了click事件,那当你点击该元素的时候两个事件都会触发的.如果需要, ...

  3. JSON的转换(将JSON转换为字符串,将字符串转化为JSON)

    eval()和JSON.stringify()   1.eval用于从一个字符串中解析出json 对象,创建包含 JSON 语法的 JavaScript 字符串.例如 var str = '{ &qu ...

  4. C++ 遇到的问题小结

    1. cannot convert 'std::basic_string<char>' to 'int' in assignment ... 原始code如下: int id2; std: ...

  5. centos 6.4/redhat 6.4 安装gitlab

    一,把所有包升级到最新版本 yum -y upgrade 二,安装最新版ruby 2.1.5 步骤http://my.oschina.net/duolus/blog/348353 三,安装官方给出的o ...

  6. Java Debugging

    1, https://visualvm.java.net/oqlhelp.html#top http://docs.oracle.com/javase/7/docs/technotes/samples ...

  7. Articles Every Programmer Must Read

    http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html Being a Java pr ...

  8. line-hieght与vertical-align的区别与联系

    7.3 line-height 行高指的是文本行的基线间的距离,但是文本之间的空白距离不仅仅是行高决定的, 同时也受字号的影响. 7.3.1 语 法 line-height属性的具体定义列表如下: 语 ...

  9. Oracle 11g 数据库自动备份执行脚本

    @echo offsetlocal enabledelayedexpansiontitle %date% %time:~,8% by LiaoNing Sunray Software Technolo ...

  10. xml学习笔记一(概述)

    XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 ...