Avez-vous envisagé d'utiliser wait
/notify
(l'équivalent de Monitor.Wait
et Monitor.Pulse
) à la place?
Vous voulez un peu de vérification pour voir si vous réellement besoin attendre (pour éviter les conditions de course), mais cela devrait fonctionner.
Sinon, quelque chose comme CountDownLatch
pourrait bien faire ce que vous voulez.
EDIT: Je viens juste de remarquer que CountDownLatch
est fondamentalement "à usage unique" - vous ne pouvez pas réinitialiser le compte plus tard, pour autant que je puisse voir. Vous pouvez vouloir Semaphore
à la place. Utilisez tryAcquire
comme celui-ci d'attendre avec un délai d'attente:
if (semaphore.tryAquire(5, TimeUnit.SECONDS)) {
...
// Permit was granted before timeout
} else {
// We timed out while waiting
}
Notez que c'est la différence ManualResetEvent
en ce que chaque appel réussi à tryAcquire
réduira le nombre de permis - donc finalement ils vont courir à nouveau. Vous ne pouvez pas le faire "définir" de façon permanente comme vous pouvez avec ManualResetEvent
. (Cela fonctionne avec CountdownLatch
, mais on ne pouvait pas « reset » it :)
Mais qu'en est-il de l'aspect timeout? D'après ce que j'ai lu dans la documentation de CountDownLatch, il ne semble pas y avoir une valeur de délai d'attente que je puisse intercepter ou arrêter avant que le délai expire à la fin. Je voudrais avoir un type Java que je peux utiliser pour attendre un timeout, et qui peut être intercepté avant la fin du timeout, comme un override manuel. Aussi, bonjour M. Skeet! Comment allez vous? Vous en avez probablement beaucoup, mais votre livre est génial! – Orca
@Voulnet: Vous appelez 'await (long timeout, unité TimeUnit)' - qui bloquera pour la durée de timeout donnée * ou * reviendra plus tôt si le loquet est décompté à 0. Heureux que vous aimez le livre :) –
Yup , la solution doit fonctionner à merveille puisque je n'ai qu'un seul objet en attente à tout moment. Merci, monsieur Jon Skeet. – Orca