[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:
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.
Citation:
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:
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