Bonsoir,
Je fais une simulation de course. Les coureurs sont représentés avec des JPROGRESSBAR et la vitesse d'un coureur dépend du temps d'endormissement au hasard (entre 0.5 et 3 seconde). Tout marche bien ou presque.
En fait, j'ai fait l'appli en MVC. Quand un coureur arrive, le Manager lui attribut une position.
Dans le Manager il y a un attribut static "POSITIONFINALE" qui s'incrémente de 1 à chaque fois qu'un coureur est arrivé.
La méthode qui attribut la position et le temps couru est synchronisée, sinon 2 coureurs qui arrivent en même temps auraient une position identique.
Mon problème :
Que je mette "synchronized" ou pas je ne vois pas de différence
Manager.java :
Coureur.java :
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
58
59
60
61
62
63
64 public class Manager { private static Manager INSTANCE = null; private ArrayList<Coureur> lesCoureurs = new ArrayList<Coureur>(); private Course laVue; private static int POSITIONFINALE = 1; private Manager(){ Coureur lievre = new Coureur("Lievre"); Coureur tortue = new Coureur("Tortue"); Coureur girafe = new Coureur("Girafe"); Coureur lion = new Coureur("Lion"); Coureur gazelle = new Coureur("Gazelle"); lesCoureurs.add(lievre); lesCoureurs.add(tortue); lesCoureurs.add(girafe); lesCoureurs.add(lion); lesCoureurs.add(gazelle); } public static Manager GETINSTANCE() { INSTANCE = new Manager(); return INSTANCE; } public void setVue(Course v){ this.laVue = v; } public ArrayList<Coureur> getLesCoureurs() { return this.lesCoureurs; } public void mettreNom() { for (BarreProgression barreCoureur : laVue.COUREURSGUI) { barreCoureur.setTitre(lesCoureurs.get(laVue.COUREURSGUI.indexOf(barreCoureur)).getNom()); } } public void mettreListeners() { for (BarreProgression barreCoureur : laVue.COUREURSGUI) { lesCoureurs.get(laVue.COUREURSGUI.indexOf(barreCoureur)).addCoureurListener(barreCoureur); } } public synchronized void mettrePositionFinale(Coureur c) { c.setTemps(); c.setPositionFinale(POSITIONFINALE); POSITIONFINALE++; } public void demarre(){ mettreListeners(); Iterator<Coureur> itCoureur = lesCoureurs.iterator(); while (itCoureur.hasNext()) { Thread coureur = new Thread(itCoureur.next()); coureur.start(); } } }
Merci d'avance de votre aide
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public class Coureur implements Runnable{ private final EventListenerList listeners = new EventListenerList(); private Animal unAnimal; private long temps; public Coureur(String nom){ this.unAnimal = new Animal(nom); } public void run(){ temps = (long) ((System.currentTimeMillis()/1000.0)%60); while (getPosition() <= Course.ARRIVE) { avancer(); fireAvancement(); if(getPosition() == Course.ARRIVE){ Manager.GETINSTANCE().mettrePositionFinale(this); fireFinCoureur(); } pause(endormissement()); } } public long getTemps() { return temps; } public void setTemps() { temps = (long) (((System.currentTimeMillis()/1000.0)%60) - temps); } public int getPositionFinale() { return unAnimal.getPositionFinale(); } public void setPositionFinale(int position){ unAnimal.setPositionFinale(position); } public String getNom(){ return this.unAnimal.getNom(); } public int getPosition() { return this.unAnimal.getPosition(); } public void avancer() { this.unAnimal.avancer(); } public void addCoureurListener(CoureurListener listener){ listeners.add(CoureurListener.class, listener); } public void removeCoureurListener(CoureurListener listener){ listeners.remove(CoureurListener.class, listener); } public CoureurListener[] getCoureurListeners(){ return listeners.getListeners(CoureurListener.class); } protected void fireAvancement(){ for (CoureurListener listener : getCoureurListeners()) { listener.avancementCoureur(getPosition()); } } protected void fireFinCoureur(){ for (CoureurListener listener : getCoureurListeners()) { listener.finCoureur(getTemps(), getPositionFinale()); } } // de 0.5 à 3 secondes private int endormissement(){ Random rand = new Random(); int tempsEndormit = rand.nextInt(3000 - 0 + 1) + 0; return tempsEndormit; } private void pause(int temps){ try{ Thread.sleep(temps); }catch(InterruptedException e){ e.printStackTrace(); } } }
Partager