Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo cerrar correctamente un socket de servidor cuando está atascado en estado de aceptación?

¿Cómo cerrar correctamente un socket de servidor cuando está atascado en estado de aceptación?

Al unirme a un ServerSocket que bloquea la aceptación en otro hilo, ¿cómo dejo de aceptar o cierro el socket?

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) {

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().