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 :

[Threads] Implémenter une pile de processus


Sujet :

Java

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Threads] Implémenter une pile de processus
    Bonjour,

    Je tente de créer un "gestionnaire de processus". Ce gestionnaire doit posséder une pile de processus en attente. Le gestionnaire peux faire tourner au maximum N processus simultanés.

    Pour cela j'ai ecris ceci :
    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
    53
    54
    55
    56
    57
     
    // pile est une LinkedList
    // Process implémente Runnable
    public void run() {
            run = true;
    
            while ( run ) {
                
                if ( pile.size()>0 && getActiveCount()<MAX_PROCESS ) {
                    try {
                        Process p = pile.getFirst();
                        new Thread(p).start();
                        pile.removeFirst();
                    } 
                    catch ( NoSuchElementException e ) {}
                } 
                else {            
                    try {
                        synchronized (this) {
                            System.out.println("wait : \n\t" + 
                                    "size : " + p.size() + "\n\t" +
                                    "actifs : " + getActiveCount()
                                    );
                            wait();                         
                        }
                    }   
                    catch ( InterruptedException e ) {
                        e.printStackTrace();
                        run = false;
                    }                
                }
            }              
        }
    
    //Lorsqu'un processus est ajouté à la pile ou qu'un processus est terminé, je //fais un notifyAll.
    // La gestionnaire implémente ProcessListener (qui écoute les évènements d'un processus)
    
     public void register(Process p) {
            if ( p== null)
                throw new NullPointerException();
            
            synchronized (this) {
                p.addProcessListener(this);
                pile.addLast(p);
                fireProcessAdded(p);            
            }
        }
    
    public void processFinished(Process p) {
            pile.remove(p);
            synchronized (this) {
                actifs --;
                notifyAll();
            }
    // Il y à aussi un listener pour le gestionnaire qui doit-être prévenu lorsqu'une conversion est terminée.
            fireProcessFinished(p);
        }
    Malheureusement, je dois ajouter troisProcesss avant que le gestionnaire ne commence à les démarrer.

    run:
    Active count 0
    wait :
    size : 0
    actifs : 0
    Enregistre le process : PremierProcess
    Active count 0
    wait :
    size : 0
    actifs : 0
    PremierProcess démarrer.
    PremierProcess essais : 13

    Enregistre le process: SecondProcess
    Active count 1
    wait :
    size : 0
    actifs : 1
    SecondProcess démarrer.
    SecondProcess essais : 7

    Enregistre le process: TroisiemeProcess
    Active count 2
    wait :
    size : 1
    actifs : 2
    tentative 0 de 7
    tentative 0 de 13
    tentative 1 de 7
    tentative 1 de 13
    ....

    SecondProcess termine apres 1185284414699 ms
    SecondProcess terminé.
    Active count 1
    Active count 1
    wait :
    size : 0
    actifs : 1
    TroisiemeProcess démarrer.
    TroisiemeProcess essais : 4

    SecondProcess FINISH

    tentative 9 de 13
    tentative 0 de 4
    ...
    TroisiemeProcess termine apres 1185284414746 ms
    TroisiemeProcess terminé.
    Active count 1
    wait :
    size : 0
    actifs : 1
    TroisiemeProcess FINISH

    tentative 11 de 13
    tentative 12 de 13
    PremierProcess termine apres 1185284414746 ms
    PremierProcess terminé.
    Active count 0
    wait :
    size : 0
    actifs : 0
    PremierProcess FINISH
    Bien que l'on voit le message du listener signalant que le process est démarré, rien ne se passe tant qu'il n'y à pas 3 process ajoutés.

    Voici le code run() d'un Process :
    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
     public void run() {
     
            //System.out.println(name + " START ");
            fireConverterStarted();
            int essais = (int) ((Math.random()*10)*2);
     
            System.out.println(name + " essais : " + essais);
            JFrame frm = new JFrame("Tentative");
            frm.setLocationByPlatform(true);
            frm.setSize(100,200);
            frm.setVisible(true);
     
            for (int i=0; i<essais; i++) {
                System.out.println("\t tentative " + i + " de " + essais);
                frm.getContentPane().removeAll();
                frm.getContentPane().add(new JLabel("Tentative " + i + " de " + essais));
                frm.validate();
                try {
                    new Socket("nonhost", 9999);
     
                } catch ( Exception e) {}
            }
            frm.setVisible(false);
     
            fireConverterFinished();
            frm.dispose();
            System.out.println(name + " FINISH ");

    Merci
    Dernière modification par Invité ; 24/07/2007 à 15h46.

Discussions similaires

  1. Implémentation d'une pile et d'une file
    Par adrian07 dans le forum Débuter
    Réponses: 5
    Dernier message: 12/06/2010, 14h41
  2. [THREAD] Implémentation d'une attente
    Par Ephasme dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 13/05/2008, 09h31
  3. implémentation d'une pile avec 2 files
    Par seb__ dans le forum Langage
    Réponses: 5
    Dernier message: 23/09/2006, 13h59
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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