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 :

Problème Thread wait / Notify


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut Problème Thread wait / Notify
    Bonjour à tous,

    j'ai un petit problème de wait sur un Thread qui même après un appel de la méthode notify ne se débloque pas...

    voici le code de la casse Thread:

    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
     
    public class USBThread extends Thread{
    ...
     
    	public static USBThread getInstance(){
    	    if( instance == null ) { instance = new USBThread(); }
    	    return instance;
    	}
     
    	public void run(){
                    .......
    		while(fin != 1){
    			synchronized(this){
    				try{
    					this.wait();
    					log.debug("Traitement du message");
                                            process();
     
    				}catch(Exception e){}
    			}
    		}
    et voici la classe qui utilise ce thread.
    En fait je crée un objkect USBThread, je récupère sa référence, je modifie un de ses objet et je notifie le thread pour qu'il puisse processer mon objet envoyé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                            USBThread usb = USBThread.getInstance();
     
    			synchronized(usb){
    				usb.sendCommand(commande);
    				usb.notify();
    			}
    lorsque cette classe appelle la méthode notify de mon threadUSB, je n'ai pas d'affichage de la chaine "Traitement du message", ni de lancement de la méthode process().

    Quelqu'un pourrait m'éclairer à ce sujet ? je bloque....

    Merci !
    Tiamat.

  2. #2
    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,


    Question bête mais : le thread est-il bien lancé ?
    Sinon avec Java 5 tu peux utiliser une BlockingQueue pour cela


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Salut adiGuba,

    oui je te confirm que le Thread est bien lancé car j'effectue une initialisation dans le Thread avant de pouvoir processer mes commandes (ouverture du port USB).

    Je vais regarder les Blocking Queue, mais étant donné que mon besoin reste assez basique, je sais que je n'aurais toujours qu'un seul thread USB, le seul truc c'est que c'est lui qui est garant de la connection USB et toute demande de traitement de commande doit passer par lui...

    pour moi la boucle infinie en attente de notify() semblait une solution parfaite pour mettre le Thread en attente de processing de commande...

  4. #4
    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
    Citation Envoyé par tiamat Voir le message
    pour moi la boucle infinie en attente de notify() semblait une solution parfaite pour mettre le Thread en attente de processing de commande...
    Comme tu ne peux pas déterminer l'ordre d'exécution des threads, il est possible que le notify() soit exécuté AVANT le wait() : du coup ton thread s'endort et ne se réveille plus....


    Il faudrait rajouter un double-check qui vérifie s'il y a des données avant le wait()...



    Mais les BlockingQueue sont justement là pour résoudre ce problème :


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    j'ai un peu regardé les BlockingQueue mais au plus j'y réfléchis au plus je me dit que l'utilisation des Thread "standards" est largement suffisante pour mon besoin (en tout cas pour le moment)...

    donc je tente d'investiguer un peu plus sur mon problème...ça doit marcher !

    du fait ta remarque sur l'ordre entre le notify et le wait est obligatoirement bon dans mon soft, mon Thread se met en wait() au démarrage de mon programme et je suis persuadé que que le notify arrive après.

    donc si j'énumère:
    - je suis sur que c'est le même Thread à qui j'envois un notify (en affichant la ref du Thread j'ai vu que c'est le même instancié au début et celui à qui j'envois un notify)
    - je n'ai pas d'exception, j'ai juste mon thread qui n'est jamais réveillé

    Avez vous une idée ? si vous voulez je peux vous faire passer un peu plus de code pour expliquer un peu mieux !

    Merci,
    Tiamat.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    met un log avant le wait(), pour être sur.
    met un log avant le notify(), pour etre sur aussi.
    a mon avis, soit le thread est pas lancé, soit le notify arrive trop tot par rapport au wait, soit tu fait pas le notify, soit encore t'as plusieurs trucs qui font un wait sur le meme objet

    et en multi threading, on ne peut pas être persuadé qu'un notify arrive bien après un wait, il faut en etre sur, et ton code n'en donne aucune garantie

  7. #7
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Question bête mais : le thread est-il bien lancé ?


    a++
    Il n'y a aucun appel de la méthode start() pour lancer le thread.

  8. #8
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Par défaut
    Salut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static USBThread getInstance(){
         if( instance == null || !instance.isAlive())  { 
              instance = new USBThread();
              instance.start();
         }
         return instance;
    }

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

Discussions similaires

  1. communication entre thread (wait notify repaint)
    Par jojo410 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 18/11/2011, 14h08
  2. Problème de wait and notify
    Par Drife dans le forum Général Java
    Réponses: 5
    Dernier message: 06/10/2011, 15h50
  3. problème avec wait() pour un thread
    Par velvet.cassandra dans le forum Général Java
    Réponses: 4
    Dernier message: 30/06/2010, 09h40
  4. [Thread] wait and notify
    Par storm_2000 dans le forum Concurrence et multi-thread
    Réponses: 0
    Dernier message: 27/10/2009, 22h24
  5. [Thread] Probleme sur wait() / notify()
    Par Jean_pierre dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 30/11/2008, 09h31

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