Problème de rebouclage avec thread!!

Fermé
supcomingenieur - 18 mars 2013 à 15:53
supcomingénieur Messages postés 74 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 16 juillet 2013 - 21 mars 2013 à 12:40
Bonjour,

j'ai une classe MonThread qui permet d'excéuter un code java de manière périodique toute les 5 secondes. voici le code:

class MonThread implements Runnable {

public MonThread() {
Thread t = new Thread(this);
t.start();
}
public void run() {

while(true) {
try {
System.out.println("j'accède au routeur maintenant");
Storage s=new Storage("ip", "communaute");
Thread.sleep(5*1000);
} catch(Exception e) {
System.out.println(e);
}}
}
public static void main(String[] args) throws Exception {
MonThread m= new MonThread();
}
}

si je met la ligne "Storage s=new Storage("ip", "communaute"); " en commentaire, le code fonctionne parfaitement et me renvoir chaque 5 sc le message "j'accède au routeur maintennat" mais si la décommente ca se bloque j'ai un premier affichage et c'est tout. le traitemant dérrière Storage est assez lourd et fait appel a d'autres classes.
Je ne comprend pas d'ou viens le problème.

merci pour votre aide

A voir également:

5 réponses

tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
Modifié par tksteph le 18/03/2013 à 16:12
Salut,
Quand tu parle de "ca se bloque" !! c'est à dire quoi exactement? Que te dit la console? S'agit il d'une exception? ...
--Pour ce qui est du résultat de l'affichage Il parait tout à fait normal que tu aie une seule ligne si jamais ta classe Storage a un problème de fonctionnement.

En Gros ton code ci-dessous n'a pas de problème, il faut plustôt voir dans ta classe Storage et essayer de débugger pour voir pourquoi son instantiation pose problème.
0
supcomingenieur
18 mars 2013 à 16:20
ca bloque c'est à dire ca m'affiche le message "j'accède maintenant au routeur" puis je n'ai plus rien.. j'ai une indication dans la console qu'une excéution est en cours mais rien ne s'affiche.

pour ce qui ed ma classe storage, quand je l'exécute toute seule elle me renvoie le résultat que je veux. mais quand je l'exécute dans le le Thread ca ne repond pas et je sais pas pk.

PS: comme je l'ai dit je n'ai aucun message d'erreur d'aucune classe.
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
18 mars 2013 à 19:05
Avec ce code :

while(true) { 
  ...
  System.out.println("j'accède au routeur maintenant"); 
  Storage s=new Storage("ip", "communaute"); 
  Thread.sleep(5*1000); 
  ...
}

Ce que tu fais, ce n'est pas "excéuter un code java de manière périodique toute les 5 secondes", mais plutôt "exécuter un code java, attendre 5 secondes et recommencer". C'est très différent !

Imaginons que l'opération new Storage(...) mette 30 secondes à se terminer, alors tu auras un affichage toutes les 35 secondes.

Si tu veux vraiment démarrer une nouvelle opération toutes les 5 secondes alors tu dois mettre ton instruction new Storage dans un Thread indépendant de la boucle.

Exemple :

class MonThread extends Thread
{
    @Override
    public void run()
    { 
        System.out.println("j'accède au routeur maintenant");
        Storage s=new Storage("ip", "communaute");
    }
}

public class Test
{
    public static void main(String[] args) throws InterruptedException
    { 
        while(true)
        {
            new MonThread().start();
            Thread.sleep(5000);
        }
    } 
}
0
supcomingenieur
19 mars 2013 à 08:36
Bonjour, merci bcp pour ton aide. ca compile sauf que je ne comprend pas trop la différence entre ca et mon ancien code (qui compile aussi d'ailleurs).

dans ton code, lorsque je lance la classe test, la classe Thread va être instanciée et donc la méthode run() sera lancé. ce qui fait que Storage va être excéuté (pendant disons 30 s) et ensuite le thread s'arrêtra pendant 5 s.

c'est l'exécution manuelle de ton code et c'est exactement ce que fait le mien ou est donc la différence??

merci
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
19 mars 2013 à 18:44
"la classe Thread va être instanciée et donc la méthode run() sera lancé. ce qui fait que Storage va être excéuté (pendant disons 30 s) et ensuite le thread s'arrêtra pendant 5 s. "

Non, justement ! Ça c'est ce que toi tu faisais...
Avec mon code, la classe MonThread va être instanciée toutes les 5 secondes indépendamment de quand se termine le traitement, puisque elle sera sur un thread séparé de la boucle.

La boucle va donc faire : démarrer un premier thread (comme il s'exécute en parallèle, on n'attend pas qu'il se termine pour continuer), on attend 5 secondes, on démarre un deuxième thread, on attends 5 secondes...

Si le traitement dure 30 secondes alors au bout de 5 secondes il y aura 2 traitements de lancés (un qui vient de commencer, et le premier qui a commencé 5 secondes plus tôt), au bout de 10 secondes il y en aura 3 (un qui vient de commencer, un autre commencé 5 secondes plus tôt, et le premier qui a commencé 10 secondes avant), etc.
À partir de t=25, il y aura 6 traitements en parallèles. Et toutes les 5 secondes on aura un traitement qui s'arrête parce qu'il a commencé 30 secondes avant, et un traitement qui démarre après les 5 secondes d'attentes.

Mon code fait donc bien ce que tu décrivais : "exécuter un code java de manière périodique toute les 5 secondes"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
supcomingénieur Messages postés 74 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 16 juillet 2013 1
21 mars 2013 à 12:40
merci bcp pour cette explication et pour le code que tu m'as fourni.
maintenant je comprend bien ce qui se passe.

Au fait si je veux faire plusieurs traitement mais de manière simultanées et non pas séquentielles (j'en ai besoins pour mettre a jour différentes table MYSQL simultanément) est ce que c'est possible de mettre chaque traitement dans un thread et de les lancer en parallèles??
0