Я собираюсь использовать ServerSocketChannel для обработки неблокирующих сокетов.
Однако он выполняется несколько раз, хотя ExecutorService имеет только один поток.
Что я сделал не так ?
(Подключите консоль, которая вызывалась только один раз через хост localhost.)
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());
}
}
введите здесь описание изображения