1. 简介
- 在 nio 模型中,需要在应用程序不断的做read系统调用,消耗系统资源,这个复杂度是O(n),但是这些read中有很多是无效的,从而引出了poll模型。
- 在poll模型中,省去了在用户空间做O(n)复杂度的read系统调用,节省了大量的资源
2. 笔者环境
3. 示例代码
- vim SocketMultiplexingSingleThread.java
- javac SocketMultiplexingSingleThread.java
- strace -ff -o out java -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider SocketMultiplexingSingleThread
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class SocketMultiplexingSingleThread {
private ServerSocketChannel server = null;
private Selector selector = null;
int port = 9090;
public void initServer() {
try {
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.bind(new InetSocketAddress(port));
selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
initServer();
System.out.println("init server finish");
try {
while (true) {
Set<SelectionKey> keys = selector.keys();
System.out.println("keys size : "+keys.size());
while (selector.select() > 0) {
Set<SelectionKey> selectionKeys = selector.selectedKeys(); //返回的有状态的fd集合
Iterator<SelectionKey> iter = selectionKeys.iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
if (key.isAcceptable()) {
acce