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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    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 :tagcode: ni le tag :resolu:

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

  2. #2
    Membre éprouvé
    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 : 40
    Localisation : Chine

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    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

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    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 :tagcode: ni le tag :resolu:

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

  4. #4
    in
    in est déconnecté
    Membre Expert 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
    Par défaut
    euh c'est pas plutot un wait dans ton main et un notify à la fin de ta méthode ?

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    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 :tagcode: ni le tag :resolu:

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

  6. #6
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    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 :tagcode: ni le tag :resolu:

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

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    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 éminent
    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
    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++

+ 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