termino - multitarea en java
Java: multiprocesamiento con dos fuentes de entrada diferentes y reacción (1)
Primera pregunta aquí en StackOverflow, así que discúlpeme si le pregunto esto incorrectamente.
Básicamente, estoy escribiendo un cliente de multidifusión que escucha de forma indefinida una dirección de multidifusión hasta que el usuario escribe "salir" en la consola. Descubrí que configurar SO_TIMEOUT para MulticastSocket, verificar si se escribió "salir" y luego volver a la llamada al método de recepción no funciona realmente, ya que un paquete podría enviarse inmediatamente después del tiempo de espera y la verificación de los bloques de la consola . Así que creo que la mejor opción es simplemente tener 2 hilos en el lugar donde uno escucha en el zócalo y bloques hasta que recibe algo, y el otro hilo escucha a la consola hasta que se lo indique. El único problema que tengo es que no estoy seguro de cómo hacer para que el hilo de escucha de la consola indique al hilo del socket que cierre el conector y termine. System.end () funcionaría, pero me temo que dejaría un socket abierto, etc.
TLDR; ¿Hay alguna manera para que el método principal de una clase inicie un hilo, y luego responda de una manera específica una vez que termina el hilo? Necesito escuchar la consola en un hilo y un MulticastSocket en otro, o simplemente en el principal de la clase del cliente.
Gracias a todos.
Socket.close()
a Socket.close()
para cerrar el socket. Esto producirá una IOException en ese hilo. entonces, antes de hacer esto, establecería una bandera como closed = true;
y haga que el otro hilo lo compruebe antes de imprimir el error, es decir, no imprima una IOException si se ha cerrado. Algo como esto.
public class SocketListener implements Runnable, Closeable {
final MulticastSocket socket;
final Consumer<DatagramPacket> packetConsumer;
volatile boolean closed;
public SocketListener(MulticastSocket socket, Consumer<DatagramPacket> packetConsumer) {
this.socket = socket;
this.packetConsumer = packetConsumer;
}
@Override
public void run() {
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
try {
while(!closed) {
socket.receive(packet);
packetConsumer.accept(packet);
}
} catch (IOException e) {
if (!closed)
e.printStackTrace();
}
}
@Override
public void close() throws IOException {
closed = true;
socket.close();
}
}
por ejemplo, en tu hilo principal puedes hacer
MulticastSocket socket = ...
Consumer<DatagramPacket> packetConsumer = ...
try (SocketListener listener = new SocketListener(socket, packetConsumer)) {
boolean finished = false;
do {
// read from the console
if (some condition)
finished = true;
} while(!finished);
} // calls close() for you.