编程语言
首页 > 编程语言> > java-具有非阻塞套接字的多线程

java-具有非阻塞套接字的多线程

作者:互联网

我正在尝试使用nio在Java中实现TCP服务器.
它只是使用选择器的选择方法来获取就绪键.然后处理这些密钥(如果它们是可接受的,可读的).服务器工作正常,直到即时消息使用单个线程为止.但是当我尝试使用更多线程来处理密钥时,服务器的响应变慢,最终停止响应,例如在4-5个请求之后.
这就是我在做什么:(伪)

Iterator<SelectionKey> keyIterator =  selector.selectedKeys().iterator();
while (keyIterator.hasNext()) {
                SelectionKey readyKey = keyIterator.next();
                if (readyKey.isAcceptable()) {
                    //A new connection attempt, registering socket channel with selector

                } else {
                    Worker.add( readyKey );
                }

Worker是执行通道输入/输出的线程类.
这是我的Worker类的代码:

private static List<SelectionKey> keyPool = Collections.synchronizedList(new LinkedList());

public static void add(SelectionKey key) {
    synchronized (keyPool) {
        keyPool.add(key);
        keyPool.notifyAll();
    }
}


public void run() {
    while ( true ) {

        SelectionKey myKey = null;
        synchronized (keyPool) {
            try {
                while (keyPool.isEmpty()) {
                    keyPool.wait();
                }
            } catch (InterruptedException ex) {                    
            }
            myKey = keyPool.remove(0);
            keyPool.notifyAll();
        }

        if (myKey != null && myKey.isValid() ) {

            if (myKey.isReadable()) {
                //Performing reading
            } else if (myKey.isWritable()) {
                //performing writing
                myKey.cancel();  
            }
        }
    }

我的基本想法是将密钥添加到keyPool中,各种线程可以一次从中获取一个密钥.
我的BaseServer类本身正在作为线程运行.它会在事件循环开始之前创建10个Worker线程.我还尝试增加BaseServer线程的优先级,以使它有更多机会接受可接受的密钥.不过,它在大约8个请求后停止响应.请帮忙,如果我做错了.提前致谢.

标签:multithreading,nonblocking,nio,synchronization,java
来源: https://codeday.me/bug/20191102/1988962.html