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);
}
}
PHP中文网2017-04-18 10:51:28
SelectionKey key = (SelectionKey) ite.next();
// 删除已选的key 以防重负处理
ite.remove(); //这样不会fail-fast
//this.selector.selectedKeys().remove(key); 这样才会fail-fast
至于原理可以看这篇文章:http://blog.csdn.net/ld513508...