Mettre en œuvre une fonction de blocage d'appel en Java
Ce qui est recommandé de /la meilleure façon de mettre en œuvre une fonction de blocage d'appel en Java, qui peut ensuite être débloqué par un appel à partir d'un autre thread?
Fondamentalement, je veux avoir deux méthodes sur un objet, où le premier appel bloque tout thread appelant jusqu'à ce que la deuxième méthode est exécutée par un autre thread:
public class Blocker {
/* Any thread that calls this function will get blocked */
public static SomeResultObject blockingCall() {
//...
}
/* when this function is called all blocked threads will continue */
public void unblockAll() {
//...
}
}
L'intention de la TVA n'est pas juste pour obtenir le blocage de comportement, mais pour écrire une méthode qui bloque jusqu'à ce que le futur quand il est possible de calculer le résultat requis.
OriginalL'auteur mikera | 2011-10-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un CountDownLatch.
À bloc, composez le:
Pour le débloquer, composez le:
OriginalL'auteur Simon Nickerson
Si vous êtes en attente sur un objet spécifique, vous pouvez appeler
myObject.wait()
avec un fil, et puis le réveil avecmyObject.notify()
oumyObject.notifyAll()
. Vous devrez peut-être à l'intérieur d'unsynchronized
bloc:aussi, il existe de nouvelles alternatives (ReentrantLock#newCondition avec des méthodes await() et signalAll()) qui doit décourager l'usage de l'archaïque wait/notify.
OriginalL'auteur Brendan Long
Il ya un couple de différentes approches et les primitives disponibles, mais les sons les plus appropriés comme un CyclicBarrier ou un CountDownLatch.
OriginalL'auteur Brian Kelly