2012-04-13 21 views
5

Ho il seguente blocco di codice:Uscire da un thread

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; 
} 

Supponiamo che ho impostato stopFlag su true. serverSocket.receive(receivePacket); attenderà fino a quando non riceverà un pacchetto. Cosa devo fare se voglio che il thread esca non appena stopFlag è impostato su true.

risposta

6

Ho avuto lo stesso problema con un socket e interrupt() non ha funzionato. Il mio problema è stato risolto chiudendo la presa. Quindi nel metodo setStop() (come proposto sopra) dovresti chiamare serverSocket.close() (dovresti ovviamente rendere serverSocket un membro della classe o qualcosa del genere).

+0

L'ho dimenticato completamente :). Spero che tu prenda la gratitudine che modificherò la mia risposta per i futuri lettori. –

+0

@mistalee ha funzionato ... grazie –

2

Non sono sicuro da dove viene il flag di stop ma in ogni caso, la risposta è interrotta.

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() non ha funzionato. –

+1

@AkhilKNambiar Ho aggiunto la parte di mistalee qui sotto. Si prega di riprovare (e di dargli un upvote) –

2

Sarebbe utile se si ha un codice che ha incluso il codice in cui si prevede di cambiare il stopFlag. Se è al di fuori del thread, potresti probabilmente usare un .interrupt() sul thread seguito da un .destroy() sul thread. Non è una soluzione ideale probabilmente meglio provare e aggiungere un timeout sul tuo server socket vedi il metodo setSoTimeout() di DatagramSocket in java api.

+2

il destroy non è necessario e non è raccomandato. –

+0

Grazie per l'input questo mette in evidenza il fatto che un'interrupt non è l'ideale in quanto il destroy non pulisce dopo il Thread meglio per lasciarlo terminare naturalmente fermando il ricevitore sospeso. L'interruzione – timash11

+1

è perfetta per questa situazione. Genera un'eccezione interrotta nel punto in cui il thread è attualmente in attesa e può essere ripulito dopo quello nel blocco catch –

0

Utilizzare serverSocket.setSoTimeout(t).