java selector.select();做了哪些动作
时间: 2023-06-10 20:06:55 浏览: 51
`Selector.select()` 方法是 Java NIO 中的一个阻塞方法,它会一直阻塞直到至少有一个通道准备好了 I/O 操作。该方法做了以下几个动作:
1. 首先,它会检查所有注册在此选择器上的通道,以确定哪些通道已经准备好了 I/O 操作。
2. 如果有一个或多个通道已经准备好了 I/O 操作,`select()` 方法会返回准备好的通道的数量。
3. 如果没有通道准备好 I/O 操作,该方法会一直阻塞直到至少有一个通道准备好了 I/O 操作,或者被其他线程中断。
4. 当一个或多个通道准备好 I/O 操作时,可以通过调用 `selectedKeys()` 方法来获取准备好的通道的集合,然后可以迭代这个集合来处理这些通道的 I/O 操作。
注意:`select()` 方法的执行是非阻塞的,即它会立即返回,但是如果没有通道准备好 I/O 操作,它会一直阻塞直到至少有一个通道准备好 I/O 操作。另外,`select()` 方法返回的是已经准备好 I/O 操作的通道的数量,而不是通道的集合。要获得准备好的通道的集合,需要通过调用 `selectedKeys()` 方法来获取。
相关问题
java selector.select() 和 serverSocket.accept(); 有什么区别
`java.nio.channels.Selector` 和 `java.nio.channels.ServerSocketChannel` 都是 Java NIO 中的类,用于实现非阻塞 I/O。
`Selector.select()` 方法是用来选取已经准备好的通道的集合,该方法会阻塞直到至少一个通道准备好了 I/O 操作。一旦有一个或多个通道准备好了 I/O 操作,该方法就会返回一个非零值,表示有多少个通道已经准备好了。你可以通过调用 `selectedKeys()` 方法来获取这些已经准备好的通道的集合。
`ServerSocketChannel.accept()` 方法是用来接受客户端连接的,该方法会阻塞直到有一个客户端连接进来。一旦有客户端连接进来,该方法就会返回一个新的 `SocketChannel` 对象,通过这个对象你可以和客户端进行通信。
简单来说,`Selector.select()` 方法是用来选取已经准备好的通道的集合,而 `ServerSocketChannel.accept()` 方法是用来接受客户端连接的。
selector.select() 底层做了哪些 ServerSocketChannel的动作
在 Java NIO 中,ServerSocketChannel 是一个用于监听客户端连接的通道,而 Selector 是一个多路复用器,可以同时监听多个通道的事件。当 ServerSocketChannel 对象注册到 Selector 中时,Selector 将会监听其 OP_ACCEPT 事件,当有新的客户端连接请求到达时,Selector 将会触发该事件,程序可以通过 ServerSocketChannel.accept() 方法获取到新的 SocketChannel 对象,然后可以将其注册到 Selector 中,用于后续的通信。
当调用 Selector.select() 方法时,底层会进行以下操作:
1. 首先,Selector 会遍历所有已经注册的通道,获取它们的感兴趣的事件集合,包括 OP_ACCEPT、OP_READ、OP_WRITE 等。
2. 然后,Selector 会阻塞等待,直到有通道的感兴趣的事件就绪或者超时。
3. 当有感兴趣的事件就绪时,Selector 将会返回就绪的通道集合。
4. 程序可以通过遍历就绪的通道集合,获取到每个通道的感兴趣的事件类型,然后根据事件类型进行相应的处理。例如,对于 ServerSocketChannel,如果有 OP_ACCEPT 事件就绪,则说明有新客户端连接请求到达,程序需要调用 accept() 方法获取到新的 SocketChannel 对象,并将其注册到 Selector 中。
5. 最后,程序可以通过 Selector.selectedKeys().clear() 方法清空已经处理过的就绪事件,以便下次重新监听。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)