Java:单线程集合遍历时,删除元素为何不导致fail-fast事件?
迷茫
迷茫 2017-04-18 10:49:28
0
2
805

http://blog.csdn.net/lw305080...
里有如下代码,while (ite.hasNext()) 代码块里有 ite.remove();
删除元素为何不导致fail-fast事件?

public void listen() throws Exception {  
    System.out.println("start server");  
    // 轮询访问selector  
    while (true) {  
        // 当注册事件到达时,方法返回,否则该方法会一直阻塞  
        selector.select();  
        // 获得selector中选中的相的迭代器,选中的相为注册的事件  
        Iterator ite = this.selector.selectedKeys().iterator();  
        while (ite.hasNext()) {  
            SelectionKey key = (SelectionKey) ite.next();  
            // 删除已选的key 以防重负处理  
            ite.remove();  
            // 客户端请求连接事件  
            if (key.isAcceptable()) {  
                ServerSocketChannel server = (ServerSocketChannel) key.channel();  
                // 获得和客户端连接的通道  
                SocketChannel channel = server.accept();  
                // 设置成非阻塞  
                channel.configureBlocking(false);  
                // 在这里可以发送消息给客户端  
                channel.write(ByteBuffer.wrap(new String("hello client").getBytes()));  
                // 在客户端 连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限  
                channel.register(this.selector, SelectionKey.OP_READ);  
                // 获得了可读的事件  

            } else if (key.isReadable()) {  
                read(key);  
            }  

        }  
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
Peter_Zhu

在单线程中,使用Iterator删除元素是正确的做法。

Ty80
SelectionKey key = (SelectionKey) ite.next();  
// 删除已选的key 以防重负处理  
ite.remove(); //这样不会fail-fast
//this.selector.selectedKeys().remove(key); 这样才会fail-fast

至于原理可以看这篇文章:http://blog.csdn.net/ld513508...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!