我正在尝试使用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个请求后停止响应.请帮忙,如果我做错了.提前致谢.