Bonjour,
Après avoir épluché plusieurs tutoriels sur la synchronisation en Java, je n'arrive toujours pas à comprendre le blocage d'un thread de mon programme.
Le thread en question est lancé par :
Il reste donc bloquer en attente d'un notify().
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 private synchronized void waitingActions() { try { wait(); } catch (InterruptedException e) { logger.warn(e.toString()); } } public void run() { while (true) { System.out.println("Waiting..."); waitingActions(); System.out.println("condition treatment"); }
La méthode suivante est ensuite appelée par un autre thread :
Cette méthode reste bloquer en attente de l'obtention du verrou déclaré de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void addChanges(...) { for (ChangeType t : ChangeType.values()) if (!pChanges.get(t).isEmpty()) logger.info("Receive..."); Set<ActionAbstract> actions = new HashSet<ActionAbstract>(); System.out.println("block"); synchronized (actionLock) { actions.addAll(executingActions); } System.out.println("unblock");
Je n'arrive pas à comprendre pourquoi le verrou n'est pas disponible. J'ai mis des messages sur toutes les autres méthodes (et verrouillages) de la classe et elles ne sont à priori pas appelées. La trace d'exécution obtenue est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private final Boolean actionLock = true;
J'ai essayé de reproduire le blocage sur un exemple jouet et je n'ai pas réussi. Je dois surement passer à côté de quelque chose
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Waiting... block![]()
Partager