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 Scope & GC


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut Thread Scope & GC
    Bonjour,

    J'ai deux questions à propos du comportement de java et du gc :

    1) Si j'ai un thread qui tourne, et que je perds le pointeur dessus, est ce que le gc va attendre que le thread termine avant de le vider (sachant qu'il peut très bien ne jamais se terminer) ou alors il le vide direct, en plein fonctionnement ?

    Qqun aurait une idée du comportement précis du truc ?

    2) J'ai une formation c/c++ donc j'ai pris l'habitude de différencier les références (qui sont des const pointeurs en gros) et les pointeurs.

    En java on appelle ça une référence pke on l'utilise avec un point, mais c'est la seule similarité avec la réference c++, vu que pour le reste ça se comporte comme un pointeur (on peut le mettre a null, le réutiliser, etc).

    Jusqu'ici, tout va bien.

    Maintenant, puisque tout est référence, j'ai une fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void fillThisString(String recipient)
    {
       recipient = "coucou";
    }
     
    public static main....
    {
      String s = null;
      fillThisString(s);
     ... 
    // s vaudra encore null
    }
    En terme de référence/pointeur, s devrait être remplie, et surtout pas laissée à null !

    Du coup, si je passe une référence en paramètre et que je veux qu'elle soit remplie, je dois faire comment ?

    Merci

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Par défaut
    En Java, tout passage se fait par valeur. Quand tu passes un objet en paramètre, tu passes en fait la valeur de sa référence. Ainsi, si dans ta méthode tu fais un new d'un objet passé en paramètre, ton objet sera toujours null dans ton appelant. Par contre, si tu altères les propriétés de cet objet dans ta méthode, elles resteront modifiées lors de ton retour dans l'appelant.

    Dans ton exemple, il suffit que ta méthode retourne la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public String fillThisString() {
       return "coucou";
    }
     
    public static main.... {
      String s = null;
      s = fillThisString();
    }
    Si tu veux vraiment passer par un paramètre, il faut alors utiliser un conteneur. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public String fillThisString(StringBuffer stb) {
       if(stb != null) {
         stb.setLength(0);
         stb.append("coucou");
       }
    }
     
    public static main.... {
      StringBuffer stb = new StringBuffer("");
      fillThisString(stb);
    }

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Pour ta question sur le Thread, tant que le thread est actif il ne sera pas récupéré par le GC.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Pour ta question sur le Thread, tant que le thread est actif il ne sera pas récupéré par le GC.

    Bulbo
    C'est pas dangereux de laisser tous ces threads dans la nature ? D'ailleurs, y a t il un moyen de récuperer un thread perdu ? (analyse de la vm ou quoi)

    D'ailleurs, est ce possible de récuperer quoi que ce soit dans la vm si on a perdu le pointeur dessus ? (en supposant que le gc ne soit pas encore passé)

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par Faiche Voir le message
    C'est pas dangereux de laisser tous ces threads dans la nature ? D'ailleurs, y a t il un moyen de récuperer un thread perdu ? (analyse de la vm ou quoi)

    D'ailleurs, est ce possible de récuperer quoi que ce soit dans la vm si on a perdu le pointeur dessus ? (en supposant que le gc ne soit pas encore passé)
    Non perdu c'est perdu, tu l'as dans le .. heu potiron

    Pour les threads ya peut-être moyen mais je ne sais plus trop comment.. dans tout les cas pour moi la question ne se pose pas, si tu as besoin d'un Thread ou d'un objet mais que tu n'en a plus la référence c'est un problème de design. A toi de mettre en place un design qui te permette de fonctionner correctement..

    Pour faire une analogie avec la vie réelle, si je balance a la poubelle le bout de chocolat et garde en main le papier d'alu (ce qui m'arrive régulièrement ) je ne peux pas (veux pas, berk) récupérer le chocolat pour le becqueter..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

    Citation Envoyé par bulbo Voir le message
    Pour les threads ya peut-être moyen mais je ne sais plus trop comment..
    Pour récupérer les threads actifs : Thread.enumerate()

    Ou avec Java 5.0 de manière plus complète via les ThreadMXBean...


    a++

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par bulbo Voir le message
    si tu as besoin d'un Thread ou d'un objet mais que tu n'en a plus la référence c'est un problème de design.
    C'était un cas théorique, mais de savoir qu'un programmeur java qui pense que le gc est magique peut balancer des zombies dans tous les sens, c'est interressant.

    Thread.Enumerate() fait des copies des thread si j'ai bien lu ? Du coup, on a toujous les thread perdus qui tournent, mais maintenant on a en plus les versions copiées ?

    D'ailleurs, les copies sont actives aussi ou non ?

    ThreadMXBean me semble mieux pour récuperer les infos. Malheureusement ça ne permet pas de fermer tout le beau monde.

    Il existe une lib qui apporte une autre implémentation des threads ? Et d'ailleurs il existe qqch qui permet de fouiller la vm etc ?

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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