Machines taraudée Etat en Java
-
19-09-2019 - |
Question
Est-il possible de tenir un fil dans un état d'attente des changements? Je veux dire attendre TLL happend quelque chose (changement var, méthode d'appel, etc ..) peut-être dont il a besoin à l'aide d'écoute d'événement ou d'objets synchronisés / méthodes ..
Le aproche habituel pour ce genre à états
qui utilise un do {..} while (true) boucle qui pourrait fonctionner pour l'application SingLED filetée (et pas d'interface graphique), mais il CANT'T être utilisé avec des fils .. (Au moins vous voulez utiliser un noyau pour chaque machine d'état fileté)
Donc, pour éviter que tâche fastidieuse processeur de façon simple (et laid) est un « vérificateur périodique », je veux dire un sommeil ajoutais autre idée est de définir un objet synchronisé et en utilisant attente au lieu de sommeil de fil
exemple:
do{
Switch(state)
{
case STATE_A:
//..A things
break;
case STATE_B:
//..B things
break;
...
case STATE_Z:
//..Z things
break;
}
// Here! => wait()? Thread.sleep(TIME_CONST)? //Hold and yield
}while(powerOn);
L'inconvénient ajoute la complexité en utilisant synchronisé ou que tout ce qui arrive dans les TIME_CONST serait invisible
Je voudrais savoir d'autres idées pour ce faire, merci!
La solution
Oui, vous utilisez wait
/ notify
. C'est ce qu'il est pour.
Ou peut-être votre machine d'état n'a pas besoin d'avoir son propre fil. D'autres threads peuvent appeler une méthode update
sur la machine d'état lorsque se produit quelque chose d'intéressant.
Autres conseils
Si vous spécifiez un en attente machine d'état Umple alors le code pour cela sera généré pour vous. Spécification d'une machine d'état umple comme mis en attente crée spécifiquement un thread qui attend les événements (appels nommés méthode). Autre code dans la classe peut se produire en même temps dans le fil d'origine (s). Le mot-clé « mis en queue » doit être placé juste avant la définition de la machine d'état.
Voir http://statemachines.umple.org pour plus d'informations sur la création de machines d'état dans Umple. Vous pouvez envisager Umple comme un simple préprocesseur pour Java (et pour d'autres langues) dans ce contexte.
Essayez d'utiliser un pipe entre le fil de source d'événements et le fil de forme de réalisation FSM. Cela suffit pour une mise en œuvre 2 filetée.