2012-04-13 13 views
5

tengo el siguiente bloque de código:la salida de un hilo

public void startListening() throws Exception { 
    serverSocket = new DatagramSocket(port); 
    new Thread() { 

     @Override 
     public void run() { 
      System.out.print("Started Listening"); 
      byte[] receiveData = new byte[1024]; 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      while (!stopFlag) { 
       try { 
        serverSocket.receive(receivePacket); 
        String message = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + message); 
       } catch (Exception ex) { 
        System.out.print("Execption :" + ex.getMessage()); 
       } 
      } 
     } 
    }.start(); 
} 


public void stopListening() { 
    this.stopFlag = true; 
} 

Supongamos que me puse a stopFlag cierto. serverSocket.receive(receivePacket); esperará hasta que reciba un paquete. ¿Qué debo hacer si quiero que el hilo salga tan pronto como stopFlag se establezca en verdadero?

Respuesta

6

Tuve el mismo problema con un socket y la interrupción() no funcionó. Mi problema fue resuelto cerrando el socket. Por lo tanto, en el método setStop() (como se propuso anteriormente) tendría que llamar al serverSocket.close() (obviamente, tendría que hacer que serverSocket sea un miembro de la clase o algo así).

+0

Me olvidé completamente de eso :). Espero que te lleven como agradecimiento que voy a editar mi respuesta para futuros lectores. –

+0

@mistalee funcionó ... gracias –

2

No estoy seguro de dónde viene la bandera de parada pero, de todos modos, la respuesta es la interrupción.

Thread t; 
ServerSoket serverSoket; 

public void startListening() throws Exception { 
    ... 
    serverSocket = new DatagramSocket(port); 
    t = new Thread()...; 
    t.start(); 
    ... 
} 

setStop() { 
    stopFlag = true; 
    serverSocket.close() 
    t.interrupt(); 
} 
+0

.interrupt() no funcionó. –

+1

@AkhilKNambiar Agregué la parte del error a continuación. Inténtalo de nuevo (y dale un voto favorable) –

2

Sería de gran ayuda si tuviera algo de código que incluía el código donde va a cambiar la stopFlag. Si está fuera del hilo, probablemente podría usar un .interrupt() en el hilo seguido de un .destroy() en el hilo. No es una solución ideal, es mejor probar y agregar un tiempo de espera en el socket del servidor, vea el método setSoTimeout() de DatagramSocket en la API java.

+2

la destrucción es innecesaria y no recomendada. –

+0

Gracias por la entrada, esto resalta el hecho de que una interupción no es ideal, ya que la destrucción no se limpia después del hilo de rosca mejor para permitir que termine de forma natural al detener la suspensión de la recepción. – timash11

+1

interrupción es perfecto para esta situación. Lanza una Excepción interrumpida en el lugar donde el hilo está esperando actualmente y se puede limpiar después de eso en el bloque catch –

0

Utilice serverSocket.setSoTimeout(t).

Cuestiones relacionadas