que tienen la siguiente estructura para la comunicación cliente-servidor TCP:Java: ¿una buena manera de detener el servidor TCP con subprocesos?
- El servidor de inicio del servidor comienza hilo aceptor, que acepte conexiones cliente y pasa ServerSocket a ella.
- Cuando llega una conexión de cliente, llamadas hilo aceptador de aceptar() en ServerSocket y sostiene cliente trabajo de procesamiento de subproceso de trabajo (en la piscina ejecutor/hilo) y proporciona socket de cliente a la misma.
- Trabajador en bucle lee datos de secuencia de socket del cliente, lo procesa y envía respuestas.
La pregunta es cómo detener con gracia todo el sistema? Puedo detener el hilo del aceptador simplemente cerrando ServerSocket. Hará que accept() bloquee la llamada para lanzar SocketException. Pero, ¿cómo detener a los trabajadores? Leen de la transmisión y esta llamada es de bloqueo. De acuerdo con this, las transmisiones no lanzan InterruptedException y, por lo tanto, el trabajador no puede ser interrumpido() 'ed.
Parece que necesito cerrar socket de trabajador de otro hilo, ¿verdad? Para esto, el zócalo debe convertirse en un campo público o se debe proporcionar un método en el trabajador para cerrarlo. ¿Será esto bueno? ¿O puede ser que todo mi diseño sea defectuoso?
No puedo marcar esta bandera mientras el trabajador está bloqueado en I/O –
La mejor práctica es usar Thread.interrupted(). Esta es la solución estándar que funcionará correctamente en ThreadPool. –
@Andrey Vityuk Thread.interrupted en realidad no es una buena práctica porque restablece el indicador de interrupción. Puede haber significado Thread.interrupt o Thread.isinterrupted. Dicho esto, como dije en mi respuesta, muchas construcciones de IO no tienen en cuenta la interrupción de la secuencia, por lo que (aunque estoy parcialmente de acuerdo con su comentario) no se cumple en esta situación. –