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

Langage Java Discussion :

Cloner une classe anonyme


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 12
    Par défaut [Résolu] Cloner une classe anonyme
    Bonjour !

    Désolé de devoir poser la question mais je ne trouve vraiment pas la solution

    J'ai donc une classe anonyme qui implémente une abstract class appelée "SMoLInformationHandlerBranch". Cette classe anonyme est instanciée après être déclarée (principe d'une classe anonyme).

    La classe SMoLInformationHandlerBranch étend la classe abstraite "SMEPPResource" qui est un thread (ca va vous suivez ? )

    Or, j'aimerais cloner la classe anonyme pour que celle-ci puisse commencer une exécution en parallèle à sa jumelle qui a encore du boulot devant elle.


    Miracle j'arrive à cloner ma classe anonyme MAIS quand je lance le thread:

    java.lang.IllegalThreadStateException

    qui vient du fait que le thread a été alloué deux fois or il est censé être cloné


    la question est donc comment cloner un thread ou alors comment parvenir à instancier une deuxième fois, une classe anonyme?
    Classe anonyme
    SMoLInformationHandlerBranch
    SMEPPResource

    merci beaucoup

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Est-ce que tu utilises des variables statiques dans ton Thread ?
    Quand tu dis que tu arrives à "cloner" ta classe, qu'est-ce que tu veux dire par là ? Tu fais un new ou autre chose ?
    Il me semble qu'un simple new devrait être bon pour lancer 2 threads simultanément à condition qu'ils ne partagent pas une ressource qui nécessite d'être vérouillée.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 12
    Par défaut
    Citation Envoyé par esteban Voir le message
    Est-ce que tu utilises des variables statiques dans ton Thread ?
    Quand tu dis que tu arrives à "cloner" ta classe, qu'est-ce que tu veux dire par là ? Tu fais un new ou autre chose ?
    Il me semble qu'un simple new devrait être bon pour lancer 2 threads simultanément à condition qu'ils ne partagent pas une ressource qui nécessite d'être vérouillée.
    je fais un super.clone()

    je ne sais pas faire un new Thread() car, par héritage, c'est la classe anonyme sur laquelle je dois faire un new


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    new org.smepp.extendFramework.SMoLInformationHandlerMainCommand()
    						{
    							public void command() throws MeasureError
    							{
    								( (org.smepp.extendFramework.SMEPPResource) Thread.currentThread() ).wait(new Long(2000),null,null);
    							}
    						}
    A l'intérieur de cette classe qui en gros est un thread et classe anonyme, j'aimerais une nouvelle instance de celle-ci.

    Je pense que de toute facon je vais devoir revoir tout ce code

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Oui en effet je pense que ton Thread.currentThread déjà t'empêchera de faire ce que tu veux faire...

    Si tu veux instancier une classe anonyme tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonType maClasse = (MonType)Class.forName("MaClasseAnonyme").newInstance ()
    Et à ce moment là tu peux lancer ton Thread si c'est un Thread.

    Cependant, je pense que je réécrirais ton code ci-dessus avec un new Runnable() {} pour être plus efficace.

    De plus, vérifie bien le niveau d'isolation de tes ressource dans tes Thread, le currentThread n'est pas bon...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 12
    Par défaut
    Citation Envoyé par esteban Voir le message
    Oui en effet je pense que ton Thread.currentThread déjà t'empêchera de faire ce que tu veux faire...

    Si tu veux instancier une classe anonyme tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonType maClasse = (MonType)Class.forName("MaClasseAnonyme").newInstance ()
    Et à ce moment là tu peux lancer ton Thread si c'est un Thread.

    Cependant, je pense que je réécrirais ton code ci-dessus avec un new Runnable() {} pour être plus efficace.

    De plus, vérifie bien le niveau d'isolation de tes ressource dans tes Thread, le currentThread n'est pas bon...

    comment on peut instancier via forName si par essence une classe anonyme... est anonyme?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    Un thread n'est pas cloneable.

    En fait ta classe SMEPPResource ne devrait pas étendre Thread mais Runnable.

    Pour lancer un SMEPPResource il suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread th =  new Thread (new SMEPPResource (...));
    th.start();
    Ou mieux, utiliser un threadpoolexecutor.

    Ensuite à toi de jouer mais attention au problème de synchronisation

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 12
    Par défaut
    merci

    Je viens de trouver un début de solution... je vais opter pour l'encapsulation. SMEPPResource encapsulera un thread et cachera ainsi l'implémentation java et me permettra de cloner par la même occasion

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Mouais...

    Je crois sincèrement que créer deux instances distinctes de Thread serait l'idéal. Tant pour la simplicité que pour la lisibilité et la compréhension.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 12
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Mouais...

    Je crois sincèrement que créer deux instances distinctes de Thread serait l'idéal. Tant pour la simplicité que pour la lisibilité et la compréhension.
    oui j'ai utilisé l'encapsulation rendant la classe SMEPPResource indépendante de la classe Thread

    c'est plus propre ainsi

Discussions similaires

  1. Redéfinir un constructeur dans une classe interne anonyme
    Par pigpen dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 31/10/2011, 14h36
  2. Réponses: 0
    Dernier message: 18/05/2010, 23h19
  3. Cloner une classe en Java
    Par Benbanana dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 25/02/2010, 00h57
  4. cloner une arborescence de classe
    Par jc63 dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/09/2007, 12h16
  5. [classe anonyme] implementant une interface
    Par stanilas dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2004, 01h18

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