¿Cómo cerrar correctamente un socket de servidor cuando está atascado en estado de aceptación?
Socket del servidor setSoTimeout
setSoTimeout
Luego use la interrupción en el hilo de escucha
De hecho, puede hacerlo directamente Cierra el socket pero arroja una excepción. Quiero decir, ¿hay alguna forma más segura y sencilla? Quiero decir, ¿cuál es una forma más segura y sencilla? ¿Desea agregar una bandera y luego, cuando quiera cerrarla, configurar la bandera para que se detenga y luego conectarse al listenerSocket? Esto es demasiado problemático
JDK5.0 tiene un nuevo paquete Java.util.current (para desarrollo multiproceso, le recomendamos que intente utilizar este paquete), el siguiente es un ejemplo de código en javadoc
Ejemplo de uso
A continuación se muestra una estructura simple de un servicio web donde los subprocesos del grupo de subprocesos se utilizan para las solicitudes entrantes. Utiliza actuadores preconfigurados. newFixedThreadPool(poolSize);
}
public void run() { // ejecuta el servicio
prueba {
for (; ;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
El controlador de clases implementa Runnable {
Socket de socket final privado;
Handler(Socket socket) { this.socket = socket }
public void run() {
// Leer y atender solicitudes en un socket
}
}
}
El siguiente método cierra ExecutorService en dos etapas. La primera fase llama al apagado para rechazar las tareas recibidas y luego llama a apagadoAhora (si es necesario) para cancelar las tareas restantes:
Código Java
void ShutdownAndAwaitTermination(ExecutorService pool) { p >
pool.shutdown(); // Deshabilitar nuevas tareas. Shutdown(); // Deshabilitar el envío de nuevas tareas
intente {
// Espere un período de tiempo para que finalicen las tareas existentes
if (! pool.awaitTermination( 60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancelar la tarea que se está ejecutando actualmente
// Esperar un período de tiempo para la tarea respuesta a cancelar
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) .
SEGUNDOS))
System.err.println("El grupo no finalizó");
}
}
} catch (InterruptedException, es decir) {
// (Re-)Cancelar si el hilo actual también se interrumpió
pool.shutdownNow();
// Preservar estado de interrupción
Thread.currentThread().interrupt();
}
}
}
Efecto de coherencia de la memoria: antes de enviar una tarea ejecutable o invocable al ExecutorService, las operaciones en el hilo ocurren antes de todas las operaciones extraídas por la tarea, que a su vez ocurren antes de los resultados obtenidos a través de Future.get().