Estoy implementando un servidor de archivos simple usando Java NIO con un subproceso de selección y varios subprocesos de trabajo (para realizar lectura/escritura real).Java NIO SocketChannel.read() con multiproceso
La parte principal del código es el siguiente:
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);
}
}
}
}
Como se puede ver en el fragmento de código, cuando se selecciona un canal de lectura/escritura, que sacar datos de lectura/escritura de la rosca selección a un hilo de trabajador.
Ahora el problema es que cuando un canal que se puede leer se transfiere a la cadena de trabajo, y antes de que termine/comienza a leerse desde el canal, el hilo de selección vuelve a funcionar y selector.select()
selecciona el canal legible seleccionado previamente (porque todavía hay buffer de entrada en el canal que aún no se ha consumido por la cadena de trabajo previamente asignada), por lo que el canal se transfiere a otra cadena de trabajo, lo que da como resultado múltiples hilos de trabajo que leen el mismo canal.
Creo que este es un problema de diseño. Mi pregunta es cómo puedo garantizar que solo un hilo lea un canal al mismo tiempo.
consulte la sección de lectura de la respuesta ma que puede ayudarlo – Amith
Si desea un servidor de archivos simple, utilizaría el bloqueo de NIO o el bloqueo de IO. En mi humilde opinión, esto es mucho más simple que jugar con selectores. –