NIOBlockingServerSelector与Executors.newFixedThreadPool

我将使用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());
        }
    }

enter image description here

iCMS 回答:NIOBlockingServerSelector与Executors.newFixedThreadPool

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1950884.html

大家都在问