Je veux bien que tu me montres comment ne pas utiliser d'attente active dans ce cas car je ne vois pas.
D'ailleurs je suis quasi sûr que ce que tu crois être de l'attente passive est de l'attente active, la méthode wait() étant native on ne sait pas exactement ce qu'elle fait, mais pour la méthode await() de java.util.concurrent.locks.Condition ce n'est qu'une attente active masquée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public final void await() throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
LockSupport.park();
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
} |
Et même si wait() était elle passive (j'en doute), on ne peut l'uitliser sans attente active que dans le même thread ( sinon déclenchement de l'exception thread not owner ).
Cela mle semble donc impossible, ceci dit s'il existe un moyen ça m'intéresse vraiment de le connaitre.
Edit: je ne parle biensûr pas des sleep() qui sont passifs mais qui ne résoudrait pas le problème ( il y aurait juste moins de passage dans la boucle avec un sleep(5) ou sleep(10) ).
Partager