Comment Bloquer et d'attendre l'aide de AtomicBoolean
Je suis à la recherche d'un moyen de faire une pause d'un Thread.
J'ai commencé avec affectivement à l'aide d'un indicateur booléen (appelé 'pause'), et de l'envelopper dans une case avec une boucle while (pause).
À l'intérieur de la boucle while, il y a un Thread.wait()
de bloquer l'exécution.
J'ai été à la recherche à la AtomicBoolean, qui semble faire l'affaire en dehors de il ne bloque pas.
Est-il une alternative ou une version étendue de AtomicBoolean qui a un bloc de la méthode ?
c'est à dire quelque chose comme AtomicBoolean.getFalse()
de AtomoicBoolean.get(false)
?
Ils ont un Blocage de la File d'attente, donc un Blocage de la valeur.
Configuration actuelle est :
while (paused.get()) {
synchronized (paused) {
try {
paused.wait();
} catch (Exception e) {
}
paused.notify();
}
}
avec
public void pause() {
if (paused.compareAndSet(false, true)) {
synchronized (paused) {
paused.notify();
}
}
}
public void resume() {
if (paused.compareAndSet(true, false)) {
synchronized (paused) {
paused.notify();
}
}
}
OriginalL'auteur Ben | 2011-11-21
Vous devez vous connecter pour publier un commentaire.
D'abord, si vous utilisez une opération atomique (quelque chose comme test-and-set),
AtomicBoolean
est aussi inutile que régulièrement Boolean (Si ils ont été mutable). Ici, je suis en utilisantcompareAndSet
, de sorte qu'il ne pénètre dans la section critique si le drapeau était en bas. N'oubliez pas de toujours débloquer enfin.Pour interrompre un thread à l'aide d'un drapeau, ne vont pas pour les actifs d'attente (certains boucle dans le corps de fil de demander "Suis-je en pause?"), comme il n'est pas une pratique efficiente. Je voudrais utiliser une attente de notification système. Lorsque le thread n'a plus de travail à faire, il appelle
wait
sur un objet. Ensuite, redémarrer, un autre thread appellenotify
sur ce même objet.Si vous avez tout de suite envie de faire une pause (en termes de sauter l'exécution lorsque le drapeau est réglé), vous pouvez diviser le code en autant d'étapes que possible, et envelopper chacun avec un test, pour finalement attendre si en pause:
En fonction de votre code, la procédure peut être même imbriquées, ou inclure undivisible unités d'exécution comportant plusieurs étapes.
OriginalL'auteur
Utiliser un
CountDownLatch
de 1:Dans le lieu que vous voulez attendre une condition pour devenir vrai:
Dans le lieu que vous souhaitez définir la condition est vraie:
OriginalL'auteur
Je ne suis pas sûr que j'ai compris de votre question, de toute façon, avez-vous regardé la classe java.util.de façon concomitante.Sémaphore?
Un Sémaphore avec un permis=1 devrait vous donner le comportement souhaité, vous pouvez émuler votre
pause=true;
de l'enseignement, avec
sémaphore.tryAcquire();
ou
sémaphore.acquire();
si vous souhaitez verrouiller l'appelant.
Vous pouvez relâcher le fil avec
sémaphore.release();
la javadoc dit: Il n'est pas nécessaire qu'un thread qui libère un permis doit avoir acquis permis par appel d'acquérir(). L'utilisation correcte d'un sémaphore est établi par la convention de programmation de l'application.
Une instance statique du Sémaphore fait le travail
OriginalL'auteur
Vous pouvez utiliser un verrou.
Dans votre fil.
Ou, vous pourriez être occupé de sommeil en fonction de la façon dont rapidement vous avez besoin d'un thread à se réveiller.
Oui, c'est pourquoi j'ai ajouté le commentaire. 😉 A mon humble avis, Il me semble un peu aléatoire si les différents threads peuvent démarrer/arrêter ce fil.
Yep, c'est une application web demande l'envoi d'un thread en cours d'exécution, pour l'amener à la pause. j'étais juste à la recherche d'une ligne de chemin de faire, plutôt que de la synchronisation des blocs avec wait() et notify().
OriginalL'auteur
Soit vous êtes en attente pour un certain temps, ce qui peut être fait avec
Thread.sleep()
ou vous avez besoin d'attendre pour quelque chose, ce qui pourrait indiquer que vous avez besoin d'appelerwait()
sur l'objet que vous êtes en attente pour être prêt.Si vous avez vraiment besoin d'être manuellement en mesure de dire à votre sujet pour continuer à travailler, à construire un
while(true)
de la boucle contenant unThread.sleep()
appel et un chèque pour un booléen qui conduit à unebreak
si bien réglé. Je ne peux pas vraiment penser à une raison pour le faire.Eh bien...mon point est que vous êtes le plus susceptible de penser au sujet de votre problème à l'envers.
la raison, en venir à la suspension de l'exécution. J'ai actuellement le wait() de la méthode. Donc, vous avez un sujet, vous voulez mettre en pause ou arrêter comsuming, un drapeau est mis en place, et pour le moment j'ai un si vrai, attendre sur le moniteur. j'espérais bloc sur l'état réel.
OriginalL'auteur