Ligne qui bloque tout mon programme.
reywas
Messages postés
19
Date d'inscription
Statut
Membre
Dernière intervention
-
mimi-bouzid Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
mimi-bouzid Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
Bonjour !
Parfois quand je me déconnecte d'internet ou quand ma box plante, le thread que j'ai créé ne se termine tout simplement jamais.
D'après mes recherches, cela vient de la ligne connection.getInputStream() qui attend tout simplement un EOF (end of file) qui n'arrive jamais puisque la connexion est rompue.
J'essaye donc par tout les moyen de stopper cette &*!?% de ligne mais rien n'y fait je galère depuis au moins 3 jours...
En gros je lance mon thread et 20 secondes plus tard, j'utilise L.interrupt dans le cas où mon thread n'est pas terminé mais ça ne fonctionne tout simplement pas.
Comment puis-je y remedier ?
Merci d'avance si vous pouvez m'aider !
Cordialement,
Reywas
Parfois quand je me déconnecte d'internet ou quand ma box plante, le thread que j'ai créé ne se termine tout simplement jamais.
D'après mes recherches, cela vient de la ligne connection.getInputStream() qui attend tout simplement un EOF (end of file) qui n'arrive jamais puisque la connexion est rompue.
J'essaye donc par tout les moyen de stopper cette &*!?% de ligne mais rien n'y fait je galère depuis au moins 3 jours...
En gros je lance mon thread et 20 secondes plus tard, j'utilise L.interrupt dans le cas où mon thread n'est pas terminé mais ça ne fonctionne tout simplement pas.
Comment puis-je y remedier ?
public static void jelancecettefonction() { Thread t = new thread(); t.start(); Syst.sleep(20000); System.out.println("interruption !"); t.interrupt(); } public void run() { System.out.print("debut thread !"); try { for(int a=0;a<20;a++) { System.out.println("a"); HttpURLConnection connection = null; System.out.println("b"); URL url = new URL("http://192.168.1.1/index.cgi/"); System.out.println("c"); connection = (HttpURLConnection) url.openConnection(); System.out.println("d"); BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); System.out.println("e"); } } catch(Exception e) { System.out.print("Le thread s'est terminé par une exception."); } System.out.print("fin thread !"); }
Merci d'avance si vous pouvez m'aider !
Cordialement,
Reywas
A voir également:
- Ligne qui bloque tout mon programme.
- Code puk bloqué - Guide
- Partager photos en ligne - Guide
- Téléphone bloqué code verrouillage - Guide
- Pavé tactile bloqué - Guide
- Compte gmail bloqué - Guide
2 réponses
J'ai un peu du mal avec ta méthode jelancecettefonction(), est-ce que
1) est-ce que la classe thread (avec un t minuscule) est juste une faute de frappe, ou est-ce que c'est une autre classe personnelle ?
2) qu'est-ce que c'est cette classe "Syst" et que fait la méthode sleep ? en particulier, est-ce qu'elle gère correctement les exceptions d'interruption ?
Sinon, pour en revenir à ton run, je pense qu'avec un Scanner à la place de ton BufferedReader tu devrais pouvoir détecter la fermeture de la connexion avec les tests hasNext, il faut tester pour vérifier.
PS. J'ai mis en place les tests d'interruptions, c'est important, on en a déjà parlé l'autre jour dans ton autre discussion Interrompre un thread correctement.
public static void jelancecettefonction() { Thread t = new thread(); // 1 t.start(); Syst.sleep(20000); // 2 System.out.println("interruption !"); t.interrupt(); }
1) est-ce que la classe thread (avec un t minuscule) est juste une faute de frappe, ou est-ce que c'est une autre classe personnelle ?
2) qu'est-ce que c'est cette classe "Syst" et que fait la méthode sleep ? en particulier, est-ce qu'elle gère correctement les exceptions d'interruption ?
Sinon, pour en revenir à ton run, je pense qu'avec un Scanner à la place de ton BufferedReader tu devrais pouvoir détecter la fermeture de la connexion avec les tests hasNext, il faut tester pour vérifier.
PS. J'ai mis en place les tests d'interruptions, c'est important, on en a déjà parlé l'autre jour dans ton autre discussion Interrompre un thread correctement.
public void run() { System.out.println("debut thread !"); URL url; try { url = new URL("http://192.168.1.1/index.cgi/"); } catch (MalformedURLException e) { e.printStackTrace(); return; } for(int a=0; a<20; a++) { if (isInterrupted()) { new InterruptedException("Interruption détectée").printStackTrace(); return; } System.out.println("a"); Scanner sc = null; try { sc = new Scanner(url.openStream()); } catch (IOException e) { e.printStackTrace(); return; } System.out.println("b"); while (sc.hasNextLine()) { if (isInterrupted()) { sc.close(); new InterruptedException("Interruption détectée").printStackTrace(); return; } System.out.println(sc.nextLine()); } System.out.println("c"); sc.close(); System.out.println("d"); } System.out.print("fin thread !"); }
Pour répondre à tes question :
1. Non ce n'était pas une faute de frappe mais bien une autre classe, dont le nom était je l'admets très mal choisi. ^^
2. Oups j'avais laissé une petite coquille. En gros c'est juste un Thread.sleep(5000).
Voici le code corrigé :
Citation :
"Sinon, pour en revenir à ton run, je pense qu'avec un Scanner à la place de ton BufferedReader tu devrais pouvoir détecter la fermeture de la connexion avec les tests hasNext, il faut tester pour vérifier."
Hum le problème c'est que là dans mon exemple j'ai pris que les lignes qui étaient nécessaires pour comprendre mais j'ai besoin de mon bufferedreader. (y'a des histoires de cookies, de sessions etc)
Cependant le BufferedReader dispose aussi d'une méthode de test qui permet de savoir si tu es toujours en mesure de lire des données, c'est la méthode ready().
Remarque : je reprends mon code, parce qu'il prends en charge les interruptions que tu n'as pas mis en place dans ton code et qu'il est pourtant important de mettre en place puisque tu veux faire des interrupt() sur ton thread, et que leur détection doit permettre malgré tout de libérer les ressources utilisées par le thread (la connexion en particulier)