2010-01-06 4 views
1

J'ai un programme de connexion au serveur par xot (x25 sur tcp/ip) protocole.java: Comment arrêter un thread qui attend de longues périodes

J'ai un thread à connecter, envoyer des données recv avec le serveur en utilisant la bibliothèque xot.

public class MyThread extends Thread{ 

    public MyThread() { 
    } 

    @Override 
    public void run(){ 
     // init sock 
     ... 

     // connect to server 
     sock.connect("server_address", timeout); 

     System.out.println("send data .."); 
     sock.send(data); 

     System.out.println("send data ok, recv data .."); 

     Data data = sock.recv(); 
     System.out.println("recv data ok"); 
    } 

} 

Mon lib i utilise peut gérer Délai de connexion, mais il n'y a pas de méthode comme setSoTimeout() pour gérer délai lors envoyer des données & recv. Donc, je ne sais pas comment arrêter mythread droit lors de l'envoi & méthode recv exécuté depuis longtemps.

quelqu'un pourrait me suggérer une solution.

grâce

Quan

Répondre

1
MyThread myt = new MyThread(); 
myt.start(); 
... later on ... 
myt.interrupt(); 

Notez que interrupt() est pas complètement infaillible (lire les docs), mais les chances sont bonnes que cela vous aidera dans votre situation. Vous devrez peut-être en plus de modifier votre propre code (dans les MyThread) pour vérifier l'état interrompu à l'aide interrupted ou isInterrupted

+0

Notez que vous avez besoin d'un second thread (ou timer) pour déclencher l'interruption car le thread ne peut pas s'interrompre. – Thilo

+0

ok, merci à tous :) – QuanNH

+0

oh, comment ajouter du code pour vérifier l'état d'interruption quand myreadlead suspend à la méthode recv pour attendre resp resp server (pas d'impression "recv data ok") – QuanNH

1

Je ne saisis pas si l'envoi/vous recevez bloquez/en attente sur un TCP « normal »/Prise IP mais si c'est le cas, il est assez facile d'annuler une opération d'E/S de l'extérieur en fermant simplement le socket. Ce n'est pas très connu, mais AFAIK est parfaitement légal, et cela fonctionne comme un charme. L'opération d'E/S donne un IOException, bien sûr, mais c'est assez facile à attraper et vous pouvez alors quitter la méthode run() de votre thread.

+0

je vais essayer, merci – QuanNH

0

Vous devez utiliser un indicateur volatile et une boucle while qui décompte jusqu'à ce que le délai d'expiration soit épuisé ou qu'une connexion se produise.

+0

comment ajouter une boucle while alors que mon thread suspend à la méthode recv pour attendre les données du serveur? – QuanNH

Questions connexes