我将使用ServerSocketChannel处理非阻塞套接字。
但是,即使ExecutorService只有一个线程,它也会运行多次。
我做错了什么?
(附加通过本地主机仅被调用一次的控制台。)
ServerSocketChannel ss = ServerSocketChannel.open();
ss.bind(new Inetsocketaddress("127.0.0.1",serverConfig.getPort()));
ss.configureBlocking(false);
Selector selector = Selector.open();
ss.register(selector,SelectionKey.OP_accEPT);
ExecutorService executorService = Executors.newFixedThreadPool(1);
AtomicInteger executorInteger = new AtomicInteger();
AtomicInteger inFor = new AtomicInteger();
while (true){
selector.select(); //blocking
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
while (it.hasnext()){
SelectionKey key = it.next();
it.remove();
System.out.println("inFor::"+inFor.getandAdd(1));
executorService.submit(()->{
System.out.println("execute::::"+executorInteger.getandAdd(1));
handleSocket(key);
});
sockets.keySet().removeIf(socket -> !socket.isOpen());
}
}