NIOBlockingServerSelector с Executors.newFixedThreadPool - PullRequest
0 голосов
/ 12 июля 2020

Я собираюсь использовать 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());
        }
    }

введите здесь описание изображения

...