我将使用Java NIO实现一个简单的文件服务器,其中包括一个选择线程和多个工作线程(用于执行真正的读/写操作)。
代码的主要部分如下所示:
如您从代码片段中所见,当选择一个可读/可写通道时,我会将读/写操作从选择线程转移到工作线程。
现在的问题是,当一个可读通道被移交给工作线程,在它完成/开始从通道读取之前,选择线程再次循环,并且selector.select()选择了先前选择的可读通道(因为通道中仍有输入缓冲区尚未被上一个工作线程完全使用),因此通道又被移交给另一个工作线程,导致多个工作线程读取同一个通道。
我认为这是一个设计问题。我的问题是如何确保同时只有一个线程读取一个通道?
代码的主要部分如下所示:
while (true) {
int num = selector.select();
if (num > 0) {
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
final SelectionKey key = keys.next();
keys.remove();
if (key.isValid()) {
if (key.isAcceptable()) {
accept(key);
} else if (key.isReadable()) {
performReadInWorkerThread (key);
} else if (key.isWritable()) {
performWriteInWorkerThread (key);
}
}
}
}
如您从代码片段中所见,当选择一个可读/可写通道时,我会将读/写操作从选择线程转移到工作线程。
现在的问题是,当一个可读通道被移交给工作线程,在它完成/开始从通道读取之前,选择线程再次循环,并且selector.select()选择了先前选择的可读通道(因为通道中仍有输入缓冲区尚未被上一个工作线程完全使用),因此通道又被移交给另一个工作线程,导致多个工作线程读取同一个通道。
我认为这是一个设计问题。我的问题是如何确保同时只有一个线程读取一个通道?