我正在尝试使用nio在Java中实现TCP服务器。简单地使用Selector的select方法获取已准备好的键,然后,如果它们是可接受的、可读的等,则处理这些键。当我只使用一个线程时,服务器运行得很正常。但是,当我尝试使用更多线程来处理键时,服务器的响应变慢,最终停止响应,比如在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();
}
}
}
我的基本想法是将密钥添加到密钥池中,各个线程可以依次获取一个密钥。 我的BaseServer类本身作为一个线程运行。 在事件循环开始之前,它创建了10个Worker线程。 我还尝试提高BaseServer线程的优先级,以便它有更多机会接受可以接受的密钥。 但是,大约在8个请求后,它就停止响应了。 请帮忙看看,我做错了什么。 预先感谢 :)