Java NIO与正则表达式的深入探索
1. Java NIO的关键概念
在Java NIO中,Selector、SelectableChannel和SelectionKey这三个类构成了实现就绪选择的核心。
1.1 处理新连接
当处理新的连接时,由于只有ServerSocketChannel对象支持OP_ACCEPT操作,且代码通常只注册一个对OP_ACCEPT感兴趣的ServerSocketChannel对象。通过对服务器套接字通道调用accept()方法,可以获取传入套接字的句柄,返回的对象是SocketChannel类型,它也是一种可选择的通道。此时,我们不创建新线程来读取新连接的数据,而是将套接字通道注册到选择器上,并通过传入OP_READ标志告知选择器我们对该通道何时准备好读取感兴趣。
如果键未表明通道已准备好接受连接,我们会检查它是否准备好读取。任何表明准备好读取的套接字通道,都是之前由ServerSocketChannel创建并注册为对读取感兴趣的SocketChannel对象之一。对于每个有数据要读取的套接字通道,我们会调用一个通用例程来读取和处理数据。需要注意的是,该例程应能处理非阻塞模式下套接字上的不完整数据,并应迅速返回,以便及时处理其他有待处理输入的通道。
在循环的底部,我们通过调用迭代器对象的remove()方法从所选键集中移除键。虽然可以直接从selectedKeys()返回的集合中移除键,但在使用迭代器遍历集合时,应使用迭代器的remove()方法,以避免破坏迭代器的内部状态。
1.2 并发问题
Selector对象是线程安全的,但它们包含的键集不是。keys(