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

 Java Discussion :

Détruire un thread à partir d'une autre classe


Sujet :

Java

  1. #1
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Détruire un thread à partir d'une autre classe
    Bonjour,
    J'ai deux classes A et B. Ma classe A instancie mon objet B en l'appelant via un thread. Dans une certaine condition de l'objet B je voudrais que A détruise le thread, le problème c'est qu'il faut donc que B envoie une information à A. J'ai donc créer une donnée membre stopThread pour mon objet A ainsi qu'un setter en public. Le problème c'est que je ne peux pas y accéder via ma classe B, et c'est normal ça ne respecte pas la logique objet... Je pense donc que mon programme est mal conçu ou alors je passe à côte de quelque chose... Pourriez-vous m'aider ?
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  2. #2
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Il suffit de faire un constructeur de B qui prend A en paramètre, et de mettre un champs A dans B, comme ça B a une référence vers A.
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Avant tout, il faudrait voir s'il est bien justifié que la classe A soit la classe qui devrait gérer le cycle de construction de B. A devrait pouvoir demander une instance de B, indépendamment du processus de construction, qui devrait être dévolu par exemple à une fabrique. Si on veut que A puisse contrôler le processus de construction, la fabrique peut retourner un handler sur B (ou du moins permettant de récupérer la future instance de B, lorsqu'elle existera). Comme la classe Future de Java par exemple. Le contrôle est assez limité dans ce cas : on peut annuler le traitement, tester s'il est annulé ou terminé, et récupérer la valeur construite. Mais on peut faire une classe similaire qui permet de connaitre par exemple l'avancement du cycle de construction de B, ou certains de ses états. En ajoutant un système évenementiel, on peut rendre asynchrone les réactions de A à ces changements d'états, ou à la progression du cycle d'avancement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Donc si je résume

    A crée B
    Sur une certaine condition de B, il faut que A arrête le thread.

    STOP !
    Pourquoi tu veux que ce soit A qui arrête le thread? Si la condition d'arrêt est dans B, tu peux te "contenter" de sortir du run, ce qui arrêtera le thread en question qui a été lancé dans A sans que A n'ait besoin de savoir ce que fait B (après tout, il n'a pas besoin par design vu que B tourne dans un autre thread)

    Sinon, il y a d'autres solutions pour que deux objets puissent communiquer ensemble de manière propre et s'envoyer des messages que chacun interprétera comme il veut (sur un mode fournisseur/consommateur), mais vu comme tu poses le problème, je pense que tu peux te contenter de faire en sorte que B s'arrête de lui même


    Après tout, il est très mauvais de tuer un thread : on prévoit des conditions de sortie
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Bonsoir à tous,
    je ne vous ai peut être pas assez donné d'informations sur le problème. Pour vous expliquer plus en détail, le but de mon programme est de permettre aux utilisateurs de s'envoyer des liens à visiter et de les ouvrir automatiquement dans une nouvelle fenêtre (navigateur) que crée mon programme. Ainsi, un utilisateurs reçoit le lien d'un autre utilisateur dans la partie client, cette dernière crée une instance de la classe Navigateur qui reçoit en paramètres l'URL. Lorsque l'utilisateur ferme la fenêtre Navigateur ou qu'aucune action n'est faite pendant un certain temps, je voudrais que ma classe Client qui a donc lancée le thread, arrête ce dernier.

    Voici le code du lancement du thread issu de la classe Client :

    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
                        Thread OuvertureNavigateur = new Thread() {
                            public void run(){
                                boolean fin = false;
                                while (!fin) {
                                    setStopThread(false);
                                    Navigateur navigateur = new Navigateur(URL);
                                    navigateur.instancier(URL);
                                    navigateur.setVisible(true);
                                    synchronized (this) {
                                        Thread.yield();
                                        fin = getStopThread();
                                    }
                                }
                            }
                        };
                        OuvertureNavigateur.start();

    L'idéal serait que je puisse accéder aux setter et getter de Client via ma classe Navigateur. Quelle solutions parmi toutes vos propositions choisir ?
    Merci à tous pour votre aide !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    L'ouverture et la fermeture du Navigateur font partie de son propre cycle de vie. La seule chose que devrait pouvoir faire ton Client c'est de faire une demande de création.
    Ainsi le fait que tu utilises un Thread n'est pas l'apanage du Client mais un "secret de fabrication".

    Concernant le timeout, s'il concerne le Navigateur cela fait encore et toujours partie de son cycle de vie. Le Client (tu me passeras l'expression) s'en tape.

    En tout cas le meilleur moyen d'arrêter une activité c'est soit Future.cancel(true) ou Thread.interrupt(). Si tu utilises cancel(true) ou interrupt() sache que cela peut avoir différent effets selon ce que tu fais sur le thread : comme levée une InterruptedException ou ClosedByInterruptException. Voir la documentation de interrupt() pour plus de détails.
    Il peut être intéressant d'utiliser un indicateur (flag) pour signaler à l'activité qu'une demande d'arrêt a été programmée et de consulter son statut régulièrement ou sur la réception d'une exception.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. [JUnit] [junit 4] Tests automatique à partir d'une autre classe
    Par Periph dans le forum Tests et Performance
    Réponses: 9
    Dernier message: 28/03/2007, 09h46
  2. probleme ecouter un panel a partir d une autre class
    Par sneb5757 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/03/2007, 11h49
  3. Réponses: 10
    Dernier message: 17/11/2006, 15h20
  4. [JtextArea] Y accéder à partir d'une autre classe
    Par harris_macken dans le forum Composants
    Réponses: 16
    Dernier message: 12/06/2005, 00h27
  5. Réponses: 22
    Dernier message: 03/02/2005, 16h43

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