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 :

[Multithreading] Worfklow : bonnes pratiques sur Callable<> & CompletionService


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
    Février 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 16
    Par défaut [Multithreading] Worfklow : bonnes pratiques sur Callable<> & CompletionService
    Bonjour,

    Dans le cadre d'un moteur d'exécution de workflow modélisant des diagrammes de Gantt, j'ai retenu les solutions techniques suivantes.

    Fonctionnement du Gantt : chaque étape a des parents et des enfants.
    La boucle principale traite les étapes dans "l'ordre d'arrivée" et propage l'évènement associé (exemple : fin d'une étape => on démarre les enfants).

    Pourriez-vous me donner votre avis sur les choix plus bas ?

    Grand merci !
    Franck


    Pour l'exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Instanciation de la mécanique de multithreading
    ExecutorService threadExecutor = Executors.newFixedThreadPool(nombreThreadsMax);	
     
    CompletionService<AEtapeExecutable> completionService = new ExecutorCompletionService<AEtapeExecutable>(threadExecutor);
    Ici j'utilise un ExecutorService pré-paramétré car je n'ai pas besoin de la logique complète d'un ThreadPoolExecutor ==> est-ce OK ?

    Pour la boucle principale

    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
     
    // Initialisation du compteur de threads
    int nombreThreadsEnCours = 0;
     
    	try {
    	// On démarre l'étape initiale
    	nombreThreadsEnCours = demarrerEtape(completionService, etapeComposee);
    	while (nombreThreadsEnCours != 0) {
     
    		// Attente de la fin de la prochaine exécution (appel bloquant!)
    		AEtapeExecutable etapeCourante = completionService.take().get();
     
    		// On décrémente le compteur
    		nombreThreadsEnCours -= 1;
     
    		// Exécution courante OK ?
    		boolean isExecutionCouranteOk = etapeCourante.getStatutExecution() != EStatutExecutionEtape.KO;
     
    		// On notifie le résultat aux enfants
    		nombreThreadsEnCours += propagerEvenement(completionService, etapeCourante, ETypeEvenement.FIN, isExecutionCouranteOk);
     
    	}
    Ici je choisis de maintenir mon propre compteur de threads ; en effet la méthode getActiveCount() d'un ThreadPoolExecutor n'est pas assez fiable ==> est-ce OK ?


    Pour la définition des tâches

    J'ai choisi de définir ainsi mes tâches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract class AEtapeExecutable implements Callable<AEtapeExecutable>
    Et de définir ainsi call :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public AEtapeExecutable call() {
     
        ... 
    		return this;
     
    }
    Ceci pour que la boucle plus haut connaisse l'étape qui vient de se terminer ==> est-ce OK ?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    J'ai un peu de mal à comprendre ce que tu veux faire exactement...
    Pourrais-tu détailler ton objectif ???

    a++

Discussions similaires

  1. Bonne pratique sur les variables
    Par cetteame dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/09/2012, 09h59
  2. JSF et bonnes pratiques sur le scope des beans
    Par RiiiDD dans le forum JSF
    Réponses: 2
    Dernier message: 22/03/2011, 10h16
  3. [Nexus] Bonne pratique sur les repos ?
    Par ZeKiD dans le forum Maven
    Réponses: 0
    Dernier message: 08/03/2011, 15h29
  4. MultiThread - Les bonnes pratiques
    Par alexadvance dans le forum Framework .NET
    Réponses: 1
    Dernier message: 14/08/2009, 22h16
  5. Bonnes pratiques sur les versions de Java et JDK
    Par JPDMJC dans le forum Général Java
    Réponses: 4
    Dernier message: 20/12/2007, 14h52

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