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 :

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();
		}
	}
 
}
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
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();
		}
	}
}
Merci d'avance de votre aide