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

StateMachine exemple

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!

Était-ce utile?

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.

Vous pouvez également utiliser Lock et Condition (Java 1.5+). Il est comme wait/notify et il est un exemple dans la javadoc

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top