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 :

Gestion de Thread


Sujet :

Java

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut Gestion de Thread
    Bonjour,

    J'aimerais avoir un petit conseil.
    J'aurais voulu connaitre la meilleure manière de gérer le démarrage et l'arrêt d'un Thread
    Ci-dessous, j'ai posté deux classes.
    La première contient la méthode run du thread et j'aurais voulu savoir comment je pouvais arrêter et redemarrer ce même Thread à partir de la seconde classe.

    merci d'avance à tous

    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
     
    public class FixTimeConsumer implements Runnable {
    ............
            public void run() {
    		while( true )	{
    			try {
    				List<TaskCS> taskCSs = oracleService.getResumeCSUs();
    				if ( !taskCSs .isEmpty() ) {
    					new RunJobPlanThread( taskCSs );
    				} else {
     
    				}
     
    				Thread.sleep( 30000 );
    			} catch ( Exception e ) {
    				throw new MainException( e );
    			}
    		}		
    	}
    ............
    }
    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
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    public class RunJobPlanThread {
    ................
            public void initRunJobPlanThread() {
    		List<Callable<RunJobPlanTaskCallable>> tasks = new ArrayList<Callable<RunJobPlanTaskCallable>>();
     
    		//On ajoute ces taches à la liste
    		Callable<RunJobPlanTaskCallable> runJobPlanTask;
     
    		for ( TaskCS taskCS : taskCSs ) {
    			runJobPlanTask = new RunJobPlanTask( taskCS );
    			tasks.add( runJobPlanTask );
    		}
     
                    ExecutorService executor = Executors.newFixedThreadPool( fixedThreadPool );
    		launchRunJobPlanTask( executor, tasks );
    	}
     
    	public void launchRunJobPlanTask( final ExecutorService executor, List<Callable<RunJobPlanTaskCallable>> tasks ) {
    		CompletionService<RunJobPlanTaskCallable> completionService = new ExecutorCompletionService<RunJobPlanTaskCallable>( executor );
    		List<Future<RunJobPlanTaskCallable>> futures = new ArrayList<Future<RunJobPlanTaskCallable>>();
    		RunJobPlanTaskCallable runJobPlanTaskCallable = null;
     
    		try {
    			for( Callable<RunJobPlanTaskCallable> task : tasks ){
    				futures.add( completionService.submit( task ) );
    			}
     
    			// Ici il faut arrêter le thread.
     
    			for ( int i = 0; i < tasks.size(); i++ ) {
    				runJobPlanTaskCallable = completionService.take().get();
     
    				if ( runJobPlanTaskCallable != null ) {
    					String errorLevel = runJobPlanTaskCallable.getErrorLevel();
    					String errorMessage = runJobPlanTaskCallable.getErrorMessage();
    					this.runJobPlanTaskCallables.add( runJobPlanTaskCallable );
    				}
     
    				if ( this.runJobPlanTaskCallables.size() == tasks.size() ) {
     
    				}
    			}
    		} catch( Exception e ){
    			throw new MainException( e );
    		} finally {
    			executor.shutdown();
    		}
    	}
    ...............
    }

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Il y a trop de choses mélangées, ici.

    Quand on a un thread qui tourne tout le temps et dont on veut parfois qu'il s'arrête et qu'il reprenne dans certaines conditions, la méthode classique est le wait()/notify().

    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
    private boolean finished = false;
    private boolean condition = true;
     
    private synchronized void waitForCondition() {
      while(!condition && !finished) {
        wait();
      }
    }
     
    public synchronized void setCondition(boolean condition) {
      this.condition = condition;
      if(condition) {
        notifyAll();
      }
    }
     
    public synchronized void setFinished() {
      this.finished = true;
      notifyAll();
    }
     
    @Override
    public void run() {
      while(!finished) {
        waitForCondition();
        // faire des trucs
      }
    }
    Mais ça se mêle mal aux ExecutorServices, qui en principe reçoivent des tâches à la chaîne à exécuter, et dédient leurs threads à ça. Si on fait ça dans un de leur thread, il se retrouve inutilisable pendant l'attente et ils ne peuvent donc pas exécuter d'autres tâches avec ce thread, qui pourtant ne fait rien d'autre qu'attendre.

    Logiquement tu ne devrais pas avoir besoin d'interrompre des tâches que tu envoies à un ExecutorService, ou alors, les interrompre définitivement et sans redémarrer.

    Comme toujours avec les threads, il faudrait qu'on ait une idée plus concrète de ce que tu cherches à réaliser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut
    Merci d'abord pour ta réponse.

    Le but est le suivant:
    Le thread principale éxécute une requete qui recupère une liste de taches a effectué en fonction de l'heure qu'il est.
    Cette tache doit s'effectuer tous les 30 secondes.

    Une fois les tâches récupérée, on les éxécute grâce à l'ExecutorService. Je désire donc arréter le thread de récupération de la liste des tâches
    car si le nombre de tâche à éxécuter est conséquente elles prendront plus de trente secondes.

    Donc je veux eviter de récupérer une nouvelle liste de tâche si il y a en a déjà une en cours d'éxécution.

    Merci

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Stop stop stop, "les tâches," "cette tâche," de quoi on parle et quand ? Des noms, un dessin.

    Et quand on commence une phrase par "le but est le suivant," les mots qui suivent ne sont jamais "Le thread." "L'ordinateur," "le verger," "la facture," "le tracteur," ce genre de choses mais pas "le thread."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut
    Oui effectivement, ce qui est clair pour moi l'est pas obligatoirement pour les autres.

    Toutes les 30 secondes, avec un thread, je récupère une liste de tâches à effectuer.
    Ces tâches sont ensuite exécutées grâce au service ExecutorService.
    Pendant que le service ExecutorService tourne je désire arrêter le thread cité ci dessus.

    J'espère que c'est plus clair.

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 797
    Points
    4 797
    Par défaut
    à vue de nez, la classe Timer est un meilleurs choix que le Thread
    Cette classe s'assure que la tâche est bien finie avant de se relancer
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par yaya0057 Voir le message
    Toutes les 30 secondes, avec un thread, je récupère une liste de tâches à effectuer.
    Ces tâches sont ensuite exécutées grâce au service ExecutorService.
    Pendant que le service ExecutorService tourne je désire arrêter le thread cité ci dessus.
    C'est pas mal, mais ça pourrait être interprété ainsi :

    "Mon programme fait une requête qui lui donne une liste de tâche à faire. Il exécute les tâches (en les envoyant à un ExecutorService et en attendant qu'elles se terminent.) Puis il attend 30 secondes et recommence."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 797
    Points
    4 797
    Par défaut
    Mouaip ! c'est exactement ce fait Timer
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    ... Ouaip, while et sleep() aussi -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 797
    Points
    4 797
    Par défaut
    Citation Envoyé par thelvin Voir le message
    ... Ouaip, while et sleep() aussi -_-°.
    Certes, certes ...
    Mais comme Timer est déjà construit pour cela ...
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par yaya0057 Voir le message
    Bonjour,

    J'aimerais avoir un petit conseil.
    J'aurais voulu connaitre la meilleure manière de gérer le démarrage et l'arrêt d'un Thread
    Arrêter: remplacer ton while(true) par un while(condition) et faire passer cette condition à vrai.

    Redémarrer: ce n'est pas possible, il faut en créer un nouveau.

    Les Runnable ne sont pas des Threads, il sont utilisés par des Threads, au passage (mais pas exclusivement).

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    J'ai bien pris note de toutes vos réponses, et je vous remercie tous.

    Merci

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

Discussions similaires

  1. gestion des threads
    Par yanis97 dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 12h41
  2. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

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