NIO 不调用iterator的remove的问题

问题描述

NIO 不调用iterator的remove的问题

package chatIO;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;

public class chatServiceNIO {

private static final int BUFSIZE = 256; // Buffer size (bytes)
private static final int TIMEOUT = 3000; // Wait timeout (milliseconds)

public static void main(String[] args) throws IOException {
    Selector selector = Selector.open();

    ServerSocketChannel listnChannel = ServerSocketChannel.open();
    listnChannel.socket().bind(new InetSocketAddress(9090));
    listnChannel.configureBlocking(false); // must be nonblocking to
                                            // register
    listnChannel.register(selector, SelectionKey.OP_ACCEPT);
    while (true) {
        if (selector.select(TIMEOUT) == 0) { // returns # of ready chans
            System.out.print(".");
            continue;
        }

        Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
        while (keyIter.hasNext()) {
            SelectionKey key = keyIter.next(); // Key is bit mask
            if (key.isAcceptable()) {
                System.out.println("accept....");
                SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
                sc.configureBlocking(false);
                sc.register(selector, SelectionKey.OP_READ);
            }
            if (key.isReadable()) {
                SocketChannel sc = (SocketChannel) key.channel();
                ByteBuffer bb = ByteBuffer.allocate(300);
                sc.read(bb);
                bb.flip();
                System.out.println(Charset.forName("UTF-8").decode(bb));

            }
            //keyIter.remove(); // remove from set of selected keys
        }
    }
}

}


这里我把iterator的remove注释了 为什么select()方法就一直返回0了啊 即使有新的连接进入 不太懂这个原理 麻烦又大神能讲下吗 万分感谢

时间: 2024-10-02 03:45:28

NIO 不调用iterator的remove的问题的相关文章

Iterator的remove方法可保证从源集合中安全地删除对象(转)

 如果对正在被迭代的集合进行结构上的改变(即对该集合使用add.remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationException异常被抛出). 如果使用迭代器自己的remove方法,那么这个迭代器就仍然是合法的. package chapter1; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Crea

java NIO

这次是关于java nio,有一些重复的发的地方.本文中的源代码可以在此处下载,下载链接为:http://115.com/file/cltlj10i#nio-src.zip 本文简介:  JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的.面向块的 I/O.本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库.您将学到诸如缓冲区和通道这样的关键 I/O 元素的知识,并考察更新后的库中的标准 I/O 是如何工作的.您还将了解只能通过 NIO 来完成

Java源码分析:深入探讨Iterator模式

java.util包中包含了一系列重要的集合类.本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理. 本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码. 集合类的根接口Collection Collect

java对象群体的组织:Enumeration及Iterator类

在一般情况下,遍历集合类会使用一下方式: for(int i=0;i<v.size();i++) Customer c=(Custormer)v.get(i); 使用Enumeration类和Iterator类可以简化这个过程 1.Enumeration类 (权举) 使用范围:Vector类 方法: boolean hasMoreElement() //测试此枚举是否包含更多的元素. Enumeration nextElement() //如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下

详解Java中Iterator迭代器的用法_java

迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因为创建它的代价小. Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素.注意:iterator()方法是java.lang.Iterable接口,被Collection继承

Java源码分析:深入探讨Iterator模式_JSP编程

java.util包中包含了一系列重要的集合类.本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理. 本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码. 集合类的根接口Collection Collect

c++-内部类是不是最好为私有的,像iterator在容器之中是不是就是私有的内部类呢?

问题描述 内部类是不是最好为私有的,像iterator在容器之中是不是就是私有的内部类呢? 内部类是不是最好为私有的,像iterator在容器之中是不是就是私有的内部类呢? 内部类的私有和公有会对内部类的成员变量和函数有什么影响呢? 解决方案 比如说LIST 的内部类Node是作为类的内部结点封装一个前后指针,在LIST内做功能(如push_back,push_front)实现的基本数据类型使用,不需要与类外做交互,LIST只需要提供功能接口即可,所以私有封装Node最佳. LIST 的内部类I

Lua iterator and generic for

lua有两种循环的用法1.  数字递增用法 > for i=1,10,3 do >> print(i) >> end 1 4 7 10 2. generic for用法 不写步长step则默认是1. > t = {"hello","nihao",nil,"yes"} > for k,v in ipairs(t) do >> print("k:" .. k .. "

接口-关于Iterator设计模式的问题

问题描述 关于Iterator设计模式的问题 正如上图所示,有点小疑问.如果我现在想在ArrayList产生的迭代器上增加一个LinkedList 不能实现的方法,此时,方法肯定不能再Iterator抽象接口处增加,那我应该在什么地方 增加这个方法?应该如何增加这个方法? 解决方案 ArrayList的迭代器作为父类,再生成一个子类添加方法 解决方案二: 我的意思是这样的,如果利用迭代器模式,那么在客户端的代码应该是这样的: List myList = new ArrayList(); Iter