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

avec Java Discussion :

Runnable et synchronisme


Sujet :

avec Java

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut Runnable et synchronisme
    Bonjour à tous,

    J'ai une classe qui lors de son initialisation va chercher une information via une requête HTTP et initialise l'un de ces attribut :

    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
    class MaClasse
    {
    	private api_level
     
    	public Maclasse()
    	{
    		getAPI();
    	}
     
    	public initURL()
    	{
    		if(api_level == 1)
    			url = "...";
    		else
    			url = "xxx";
    	}
     
    	private void getAPI()
    	{
    		new Thread(new Runnable(){
    			//Requête HTTP + lecture de réponse
     
    			api_level = response; 
    			initURL();
    		}).start();
    	}
    }
    puis cette classe est passée à un autre objet qui va venir lire l'attribut initialisé (url) et ce dans un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse mc = new MaClasse();
    AutreClasse.setObjet(mc);
    Je n'ai pas encore effectué de test , mais j'imagine que au moment de AutreClasse.setObjet(mc); selon la durée de la requête, il est tout à fait possible que initURL(); n'est pas encore été appelé , exact ?

    Dans ce cas comment m'assurer qu'au moment ou je vais faire appel à MaClasse.getUrl(); j'aurais bien une valeur correctement initialisée ?

    merci
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Remarque: Dans l'état actuel, en plus de diverse fautes dans ton code, le thread n'est jamais démarré (méthode start() jamais appelée) dans la méthode getAPI().

    Pour ta problémtatique tu peux utiliser l'interface Future et son implementation FutureTask qui permettent d'exécuter une méthode et de récupérer un résultat de façon asynchrone.
    Par contre ce n'est pas terrible de lancer une initialisation asynchrone dans le constructeur de ton objet.
    Il est préférable de d'abord faire la requête, puis une fois la réponse reçue, d'instancier la classe.

    Voici un 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
    public class MaClasse {
     
        private final int apiLevel;
     
        private final String url;
     
        public MaClasse(int apiLevel) {
            this.apiLevel = apiLevel;
            switch (apiLevel) {
                case 1:
                    url = "...";
                    break;
                default:
                    url = "xxx";
                    break;
            }
        }
     
        public static Future<MaClasse> request() {
            final FutureTask<MaClasse> future = new FutureTask<MaClasse>(maClasseRequest);
            final Thread thread = new Thread(future);
            thread.setDaemon(true);
            thread.start();
            return future;
        }
     
        private static final Callable<MaClasse> maClasseRequest = new Callable<MaClasse>() {
            @Override
            public MaClasse call() throws Exception {
                //Requête HTTP + lecture de réponse
                return new MaClasse(responseApiLevel);
            }
        };
     
    }
    Donc tu récupères le résultat asynchrone comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Future<MaClasse> future = MaClasse.request();
    Je te laisse regarder la javadoc de l'interface Future pour les différentes méthodes permettant de gérer le résultat asynchrone .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Eh bien, le plus simple est a priori de ne pas utiliser de thread, vu que dans l'exemple que tu donnes il ne sert à rien et te complique la vie.

    Dans un scénario plus compliqué où les threads seraient utiles (genre un pool de threads est chargé des opérations d'IO HTTP de toute l'application pour éviter des context switch à gogo,) tu pourrais juste encadrer l'accès à l'URL avec des méthodes synchronized, et faire wait() tant que l'URL n'a pas été récupérée, et notify() quand elle l'a été.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Thread]Runnable ==> 2 thread différents
    Par PoZZyX dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 31/03/2006, 13h09
  2. Thread avec Implements Runnable
    Par pier* dans le forum Java ME
    Réponses: 1
    Dernier message: 26/02/2006, 22h46
  3. [debutant] taches avec implements runnable
    Par comme de bien entendu dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 01/02/2006, 18h12
  4. Runnable
    Par Tempotpo dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2006, 14h43
  5. [JDBC][Derby]Problèmes sur un runnable
    Par koko- dans le forum JDBC
    Réponses: 3
    Dernier message: 08/09/2005, 11h05

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