0

Comment suspendre un thread jusqu'à ce qu'une condition devienne vraie sans attente en attente? Par exemple, supposons que je vérifie pour voir siComment suspendre un thread jusqu'à ce qu'une condition devienne vraie sans attente en attente?

playerOne.isWalking()

va être vrai et je veux exécuter un code quand il ne devient vrai. Encore une fois supposons que playerOne est une instance de la classe Player qui a alors la fonction isWalking(). Je n'ai pas accès à ce qui rend isWalking() devenu vrai. Donc, chaque fois que je veux vérifier si isWalking() est vrai, je dois appeler la méthode d'une instance de joueur explicitement. J'ai essayé d'utiliser Wait/Notify dans les blocs synchronisés, mais cela ne fonctionnerait jamais car je devrais avertir manuellement le Thread de se réveiller quand isWalking() devient vrai et je ne sais pas quand il deviendra vrai.

J'ai essayé d'utiliser le modèle d'observateur pour faire de Player une sous-classe d'observable afin que je puisse appeler la méthode de mise à jour quand isWalking() devient vrai mais je ne sais pas encore quand cela se produira.

J'ai même essayé d'utiliser Propertys mais cela ne fonctionnerait pas non plus.

Est-il même possible de vérifier sans attendre-occupé? Constamment interroger et appeler cette fonction pour voir si c'est vrai, alors si c'est vrai, exécutez le code.

Ce fut une mauvaise solution que je fait impliquant occupé en attente:

Busy-Waiting solution

+0

Bienvenue dans Stack Overflow! S'il vous plaît prenez le [tour] (http://stackoverflow.com/tour), jetez un coup d'œil autour, et lisez le [centre d'aide] (http://stackoverflow.com/help), en particulier [Comment puis-je demander une bonne question?] (http://stackoverflow.com/help/how-to-ask) et [Quels sujets puis-je poser à propos d'ici?] (http://stackoverflow.com/help/on-topic). –

Répondre

0

Le problème est que vous underlaying utilisez une méthode getter pour acquérir une information et d'agir sur elle. Le principe qui est violé ici est Dites, ne demandez pas!.

L'OO whay pour résoudre ceci est d'introduire une interface (par exemple: PlayerMovingListener).

La classe de lecteur contiendrait une instance d'un objet implémentant cette interface (ou une liste d'entre eux). Dès que le joueur commence à marcher, il appelle la méthode isMoving() définie dans l'interface implémentée par le (ou tous) objet (s) écouteur (s) détenu (s) par le joueur.
Le plus probable est déclenché par une méthode setter dans votre implémentation Payer actuelle.

+0

J'apprécie la réponse rapide. Je n'ai accès à aucun setter s'il y en avait un dans l'implémentation actuelle de Player à partir de l'API que j'utilise. 'Public boolean isInCombat() {/ * code compilé * /}' isInCombat() est la fonction isWalking() dont je parlais, juste renommée par souci de clarté. Alors, reste-t-il des options? – TheAppFoundry

+0

* "Je n'ai accès à aucun setter s'il y en avait un dans l'implémentation actuelle de Player à partir de l'API que j'utilise." * - Vous ne pouvez pas implémenter le pattern d'écoute d'un seul côté.La classe 'Player' doit fournir l'infrastructure pour gérer les écouteurs. IMHO votre programme est * brisé par la conception *. –

+0

Il est cassé par la conception. Cela répond! – TheAppFoundry