IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

[Thread] Synchronisation de thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut [Thread] Synchronisation de thread
    Bonjour

    Voici mon problème. Dans une fonction, je crée un thread. Pour le moment, ce thread ne s'occupe que d'afficher un message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    private void launchBlast() throws IOException{
    		System.out.println("Blasting...");
    		Thread t = new Thread(){
    			public void run(){
    				String cmd = "ssh gldavid@cluster blastall -p blastn -d "+db+" -i "+inputfile+" -m 7 -o "+outputfile;
    				System.out.println(""+cmd);
    				//Runtime.getRuntime().exec(cmd);
    			}
    		};
    		t.start();
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) throws IOException {
    		JBlast jBlast = new JBlast();
    		jBlast.verifyArgs(args);
    		jBlast.launchBlast();
    		System.out.println("Finished the blast");
    	}
    Or, avec ce code, je remarque l'affichage suivant à l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Blasting...
    Finished the blast
    ssh gldavid@cluster blastall -p blastn -d /bioxpr/cluster/databases/blast/refseq/Homo_sapiens/refseq_Homo_sapiens_rna -i /home/gldavid/seq.txt -m 7 -o /home/gldavid/results.xml
    Donc, le thread est exécuté après ma fonction
    J'eus plutôt souhaité avoir le message de mon thread avant la fin de ma fonction.

    Comment résoudre donc ce problème ?

    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Justement l'interet du thread est de pouvoir effectuer 2 taches en même temps, donc ta fonction lance ton thread et se termine, le thread lui s'execute en même temps que ton System.out.println ... Il est donc plutot logique que tu aie ce résultat.
    Pour ce qui est de la synchronisation, je ne vois pas trop de solution à ton probleme, je me trompe peut-être mais il me semble que tu cherches à faire du mono-thread en multi-thread

    bye bye

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Hello

    Merci de ta réponse Mavina.
    J'ai tenté de faire attendre mon processus principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void launchBlast() throws IOException, InterruptedException {
    		System.out.println("Blasting...");
    		Thread t = new Thread(){
    			public void run(){
    				String cmd = "ssh gldavid@cluster blastall -p blastn -d "+db+" -i "+inputfile+" -m 7 -o "+outputfile;
    				System.out.println(""+cmd);
    				//Runtime.getRuntime().exec(cmd);
    			}
    		};
    		t.start();
    		while(t.isAlive())
    			this.wait();
    	}
    Mais bon, je me mange cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Blasting...
    Exception in thread "main" java.lang.IllegalMonitorStateException
    	at java.lang.Object.wait(Native Method)
    	at java.lang.Object.wait(Object.java:474)
    	at com.bioxpr.JBlast.JBlast.launchBlast(JBlast.java:69)
    	at com.bioxpr.JBlast.JBlast.main(JBlast.java:78)
    ssh gldavid@cluster blastall -p blastn -d /bioxpr/cluster/databases/blast/refseq/Homo_sapiens/refseq_Homo_sapiens_rna -i /home/gldavid/seq.txt -m 7 -o /home/gldavid/results.xml

    pas cool !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    euh c'est pas plutot un wait dans ton main et un notify à la fin de ta méthode ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Sans doute oui ! Les thread n'ont jamais été mon fort (en témoigne mes notes pitoyables sur ce sujet pour la simulation SCJP)

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    wait() permet de faire le la synchronisation et doit obligatoirement être utilisé dans un bloc synchronized :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        private void launchBlast() throws IOException {        
            System.out.println("Blasting...");
            Thread t = new Thread(){
                public void run(){
                    String cmd = "ssh gldavid@cluster blastall -p blastn -d db -i inputfile -m 7 -o outputfile";
                    System.out.println(""+cmd);
                    //Runtime.getRuntime().exec(cmd);
                    
                    // On notifie l'élément parent :
                    synchronized(JBlast.this) {
                        JBlast.this.notify();
                    }
                }
            };
            t.start();
            
            // On se met en attente jusqu'à ce qu'on soit notifié
            synchronized(this) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // Interrupted
                    e.printStackTrace();
                }
            }
        }
    il faudrai toutefois utiliser le wait() avec un timeout et vérifier l'état réel du thread pour éviter les interblocages...

    Mais du coups je suis plutôt d'accord avec mavina : pourquoi faire un thread si c'est pour attendre qu'il se termine pour continer ???

    a++

  7. #7
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Juste après ton :
    Il faut que tu rajoute :
    Ca va faire en sorte que ton programme courant va attendre que ton thread soit terminé pour continuer à s'exécuter.

  8. #8
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ben, c'est pas mieux ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    private void launchBlast() throws IOException, InterruptedException {
    		System.out.println("Blasting...");
    		Thread t = new Thread(){
    			public void run(){
    				String cmd = "ssh gldavid@cluster blastall -p blastn -d "+db+" -i "+inputfile+" -m 7 -o "+outputfile;
    				System.out.println(""+cmd);
    				//Runtime.getRuntime().exec(cmd);
    			}
    		};
    		t.start();
    		//System.out.println(""+t.getPriority());
    		while(t.isAlive())
    			this.notify();
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) throws IOException, InterruptedException {
    		JBlast jBlast = new JBlast();
    		jBlast.verifyArgs(args);
    		jBlast.wait();
    		jBlast.launchBlast();
    		System.out.println("Finished the blast");
    	}
    Apparemment, il se plante toujours sur le wait().

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Cool !!!

    Un grand merci à adiGuba
    Merci à toi !!! Peut être vais-je un peu mieux comprendre les Threads avec ça

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  10. #10
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    La solution du join ne serait pas plus simple, parce que là j'ai un l'impression que vous réinventez la roue.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nighthammer
    La solution du join ne serait pas plus simple, parce que là j'ai un l'impression que vous réinventez la roue.
    Oui en effet la solution de join() est bien meilleure pour attendre la fin du thread. Le couple wait()/notify() permet par contre beaucoups plus de chose du coté de la synchronisation...

    A noter également l'existence des Lock et de plusieurs autres fonctionnalitées dans le package java.util.concurrent de Java 5.0...

    Mais dans les deux cas, exécuter un thread pour attendre qu'il soit fini est un peu inutile...

    a++

  12. #12
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Je me permet d'ajouter cette précision que j'aurais dû mentionner plus haut.
    J'ai dû développer aux normes Java 1.4.2.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Thread] Synchroniser des threads
    Par GLDavid dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 24/06/2006, 16h34
  2. Réponses: 1
    Dernier message: 23/05/2005, 15h52
  3. [Thread] synchronisation globale
    Par guejo dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 16/02/2005, 11h56
  4. [Thread][Synchronisation] Exclusion mutuelle
    Par masto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 20/01/2005, 16h02
  5. Synchronisation de thread
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 07/01/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo