Partage
  • Partager sur Facebook
  • Partager sur Twitter

Thread concurrent

    12 décembre 2010 à 15:59:16

    Bonjour,

    J'ai un petit soucis, je voudrais éviter que mon application créer plusieur fois le même thread. Comment faire ça ?
    Mon appli lance une méthode qui créer un Thread et l'éxécute. On lors de l'appel succesif de cette méthode, un nombre important de thread peut être crée.
    Je voudrais faire en sorte qu'un seul thread puisse se lancer à la fois (et interrompre le précédent). Comment faire ?

    Ex:
    public void OnCreate() {
        new Thread() {
    	public void run() {
    		setListFromXml();
    	}
        }.start();
    }
    


    J'ai vu qu'il y avait join, mais je sais pas trop comment l'implémenter...
    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2010 à 16:12:44

      désolé je ne pense pas avoir très bien compris comme était composé ton programme mais :
      quel est l'intérêt de créer des threads si c'est pour qu'il n'y en ait toujours qu'un seul qui s'exécute à la fois ? (en supprimant les autres)

      voilà sinon passé cette question :
      Ne déclare pas anonymement tes threads, sinon comment pourra tu les contrôler ?!

      Voilà une fois tes threads déclarés tu pourras les contrôler... il y a de diverses façons mais le mieux pour l'arrêter est de le demande toi même :
      J'imagine que tu as une classe particulière où tes Threads travailles, il faut que tu déclare une variable d'arrêt et que tu demande périodiquement si le thread doit s'arrêter
      Il ne s'arrêtera pas immédiatement ! Donc tu vérifie périodiquement si le thread a fini son boulot avant de lancer ton nouveau thread.

      Donc
      -----------------------------------
      tonThread.stop(); // Cette fonction va demander la mort de ton thread en modifiant une variable booleenne qui sera lu plus tard par exemple (mort)

      -----------------------------------
      Ta fonction qui s'execute :
      tant que (!mort){
      // Je fais mon tralala, un thread viendra me remplacer
      }
      jaifini = true;

      -----------------------------------
      SI thread.jaifini = vrai alors je balance mon nouveau thread


      Si tu as compris le principe tu n'a plus qu'à coder en 1 minute c'est fait !
      • Partager sur Facebook
      • Partager sur Twitter
        12 décembre 2010 à 16:47:59

        En fait je developpe sous Android.

        Lors de l'appel de la creation de la première page, il doit recupérer un flux XML et l'affecter à une listview (ce qui prend un peut de temps).

        Si j'ai mis un thread c'est pour qu'en attendant, il affiche une barre de progression. Quand il a finit il arrete cette barre de progression et affiche le contenu sur la listview.

        Malheureusement, il appelle la méthode OnCreate(...) à chaque fois qu'il y a une rotation de l'écran. Donc pour un portable créer autant de thread est trop gourmand.


        Pour le moment, j'ai fait ainsi pour m'en sortir :
        if(lst_prog.isEmpty()) { // lst_prog est une arraylist qui est remplis via setListFromXml()
        	final ProgressDialog progressDialog = ProgressDialog.show(Prog.this, "", "Chargement en cours...");
        
        	final Runnable runInUIThread = new Runnable() {
        		public void run() {
        			showListView(); // Affecte la liste à l'interface   	     
        		}
        	};			
        	new Thread() {
        		public void run() {
        			setListFromXml();
        			progressDialog.dismiss(); // Arrête la barre de progression
        			uiThreadCallback.post(runInUIThread);
        		}
        	}.start();
        } else {
        	showListView();
        }
        


        Je test si ma liste a déjà été remplis, si oui, je ne fais que l'afficher.

        Mais je voulais faire une version avec seulement 1 thread.


        Dans mon cas si je dois nommer mon Thread, ça sera forcement une variable static (car sinon c'est écrasé à chaque fois).
        Est ce que ma solution est bonne ? Ou gérer la concurrence du thread serai mieu ?
        • Partager sur Facebook
        • Partager sur Twitter

        Thread concurrent

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown