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 :

Obtenir un Thread à partir de son nom


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut Obtenir un Thread à partir de son nom
    bonjour,

    j'ai un Thread nommé par exemple name, je veux l'obtenir sans passer par une boucle, car c lourd à gérer s'il y a plusieurs Threads actifs. J'ai fait comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                Thread[] tha = new Thread[Thread.activeCount()];
    	int n = Thread.enumerate(tha);
    	for (int i = 0; i < n; i++) {
    		if (tha[i].getName().equals(name))
    			...
    	}
    merci de vos suggestions

  2. #2
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    A ma connaisance ce n'est pas possible. De plus deux threads peuvent porter le même nom.

    A+
    Hydraland

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    salut,
    merci de m'avoir repondu

    En fait le thread que je cherche, c moi qu'il a nommé . Donc pas de soucis sur le fait que 2 threads pouvaient eventuellement avoir le même nom.

  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
    Salut,


    Tu pourrais étendre la classe Thread pour lui donner ce comportement, par exemple :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class NamedThread extends Thread {
     
    	/** Map d'association Nom/Thread */
    	private static final Map<String,NamedThread> THREADS = new HashMap<String, NamedThread>();
     
    	/** Méthode static permettant de récupérer un Thread par son nom */
    	public static NamedThread getByName(String name) {
    		return THREADS.get(name);
    	}
     
    	/**
             * Méthode privée qui enregistre le thread dans la Map
             * (utilisé par le constructeur seulement)
             */
    	private void register() {
    		THREADS.put(this.getName(), this);
    	}
     
    	/**
             * Supprime le thread de la Map d'association
             */
    	public void unregister() {
    		THREADS.remove(this.getName());
    	}
     
    	/**
             * On redéfinit finalize() 
             */
    	@Override
    	protected void finalize() throws Throwable {
    		unregister();
    		super.finalize();
    	}
     
    	public NamedThread(Runnable target, String name) {
    		super(target, name);
    		register();
    	}
     
    	public NamedThread(String name) {
    		super(name);
    		register();
    	}
    }
    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    salut,

    merci pour ta reponce.
    Ta solution ne pourrait pas marcher dans mon cas, moi je dois connaitre quel Thread execute une requête bien précise, pour savoir aprés si l'utilisateur en a fini de l'action (fermeture du browser). donc à l'action je fais comme ça:
    Thread.currentThread().setName(source) et après dans une autre action je verifie si le Thread du nom source est active par une boucle for ...

    c'etait bien tenté

  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
    Citation Envoyé par al3alwa
    Ta solution ne pourrait pas marcher dans mon cas, moi je dois connaitre quel Thread execute une requête bien précise, pour savoir aprés si l'utilisateur en a fini de l'action (fermeture du browser). donc à l'action je fais comme ça:
    Thread.currentThread().setName(source) et après dans une autre action je verifie si le Thread du nom source est active par une boucle for ...
    Tu pourrais expliquer l'intérêt de tout cela ???

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    salut,

    je suis sur une appli web, j'ai des fichiers sur le serveurs que je gere à partir de l'appli par des utilisateurs dont le profil est administrateur. Sauf que je veux qu'a la fois un seul administrateur accede à un fichier. par exemple dans l'action modifier qui recupere le fichier (nomme par exemple essai) à partir du serveur par le biais de l'objet HttpServletResponse, je nomme le thread qui execute l'action avec le nom du fichier que je recupère à partir de la base. Ainsi si un autre administrateur veut modifier ce fichier, je verifie si le thread dont le nom est essai est alive ou nom, s'il est actif je met le dernier thread en attente wait() sinon je lance l'action. NB je travaille avec struts.

  8. #8
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut Pbm méthode
    Bonjour,
    pour ton problème, il ne faut pas s'appuyer sur les Thread mais sur des verrous, par exemple basé sur un Semaphore. (avec 1 seul "permits")
    http://java.sun.com/j2se/1.5.0/docs/...html#acquire()
    Tu fait un semaphore.tryAcquire: si le semaphore n'est pas bloqué ça renvoie true, s'il l'est ça renvoie false et tu peux afficher à l'administrateur que le fichier est en cours d'utilisation.
    Autre sol: tu peux également faire un "acquire simple" pour bloquer le Thread en cours et le relacher après le release du sémaphore. (mise en file d'attente)

    Après le close sur le fichier tu fait un release du sémaphore pour le libérer pour la prochaine utilisation.

    Et il faut te gérer un singleton pour ta Web-App pour conserver l'instance du sémaphore. (note: si tu voulais conserver ton fonctionnement basé sur un Thread, le singleton serais également LA solution pour conserver son instance, mais un Thread n'est vraiment pas la solution ici)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    merci deltree,

    il y a 2 problème dans ta solution:
    le premier est que je travaille sur java 1.4 mais là c pas grave car je peux implementer les semaphores.
    le deuxieme est que j'envoie le fichier sur un post ie le fichier est afiché dans un popup lors d'un click sur un bouton lié à une action...
    donc pour moi fermeture du popup equivaut a monThread.isAlive = false.

    voilà ma question: comment avec les semaphores ou autre savoir qu'un administrateur a fini de travailler sur le fichier et qu'il a fermé le popup.


    merci de vos suggestions

  10. #10
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut Question: verrou sur popup?
    1. il existe des implémentation Sémaphore, je ne sais pas ce que ça vaut:
    http://www-igm.univ-mlv.fr/~roussel/...Semaphore.html

    2. le problème se complique: veut tu que le fichier soit verrouillé pendant le temps d'ouverture de la popup, ou juste de temps de l'écriture du fichier.
    dans ce 1er cas: tu peux très bien laisser le sémaphore "aquired" le temps que la fne^tre soit ouverte: le porblème se pose lorsque rien ne vient relacher le sémaphore (l'administrateur a fermé la fenêtre ou session brutalement interrompue)
    - il faut alors en plus prévoir un time-out pour relâcher le sémaphore (simple si tu le développe toi-même)
    - mais en plus prévoir une gestion d'erreur si l'admin valide la popup après le time-out. (stocker en plus du sémaphore l'id de session ou d'utilisateur correspondant à celui qui l'a acquis)

    Tu peux envoyer une requête (en AJAX ou simple) sur la fermeture de fenêtre via du javascript, mais ce ne seras pas fiable à 100%

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    salut tout le monde,

    dans la solution de deltree, j'ai pas compris comment l'action saura que la page a été fermé par l'administrateur via une requête javascript.

    merci d'avance pour vos reponses

Discussions similaires

  1. [XSLT] obtenir la valeur d'un noeud à partir de son nom
    Par gambic dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/10/2009, 11h10
  2. [VB.NET] Obtenir un objet à partir de son nom
    Par bart64 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/12/2006, 12h37
  3. connaitre les propriétés d'un champ à partir de son nom
    Par toome dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/10/2005, 11h16
  4. Récupérer une variable à partir de son nom ...
    Par CynO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/10/2005, 16h59
  5. Réponses: 3
    Dernier message: 24/09/2004, 21h21

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