Cette question a sans doute été posée sous diverses formes dans le passé, mais pas tellement pour un scénario spécifique.Quelle est la manière correcte d'arrêter un thread en attente d'une activité réseau?
Quelle est la manière la plus correcte d'arrêter un thread qui bloque en attendant de recevoir un message réseau via UDP.
Par exemple, dire que j'ai le fil suivant:
public class ClientDiscoveryEngine extends Thread {
private final int PORT;
public ClientDiscoveryEngine(final int portNumber) {
PORT = portNumber;
}
@Override
public void run() {
try {
socket = new DatagramSocket(RECEIVE_PORT);
while (true) {
final byte[] data = new byte[256];
final DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
}
} catch (SocketException e) {
// do stuff 1
} catch (IOException e) {
// do stuff 2
}
}
}
Maintenant, serait la façon plus correcte soit en utilisant la méthode interrupt()
? Par exemple en ajoutant la méthode suivante:
@Override
public void interrupt() {
super.interrupt();
// flip some state?
}
Mon seul souci est, est socket.receive()
pas une méthode de blocage non interruptible? La façon dont j'ai pensé serait de mettre en œuvre la méthode d'interruption comme ci-dessus, dans cette méthode appelez socket.close()
et ensuite prendre en charge dans la méthode run
dans le catch pour le SocketException
. Ou peut-être au lieu de while(true)
utiliser un état qui est retourné dans la méthode d'interruption. Est-ce la meilleure façon? Ou y a-t-il une manière plus élégante?
Merci
Err, non. l'interruption est là pour arrêter un fil.C'est en fait le seul moyen de le faire si le thread peut être bloqué dans un appel bloquant qui réagit aux interruptions (comme Thread.sleep, Object.wait, lire depuis un canal interruptible, etc.). Lisez http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html. –