2 Stimmen

Threaded State Machines in Java

Gibt es eine Möglichkeit, einen Thread in einem Zustand zu halten, in dem er auf Änderungen wartet? Ich meine warten, bis etwas passiert (Var ändern, Methode aufrufen, etc.) vielleicht braucht es Event Listener, oder synchronisierte Objekte/Methoden..

Der übliche Ansatz für Statemachines wie diese

Beispiel einer Statemachine

Das verwendet eine do{..}while(true) Schleife, die für einzelne threaded (und keine GUI) Anwendung funktionieren könnte, aber es kann nicht mit Threads verwendet werden (zumindest wollen Sie einen Kern für jeden Thread-Zustandsautomaten verwenden)

Um diese prozessorintensive Aufgabe zu vermeiden, gibt es einen einfachen (und hässlichen) Weg ist ein "periodischer Checker", also das Hinzufügen eines Sleep eine andere Idee ist die Definition eines synchronisierten Objekts und die Verwendung von wait anstelle von thread Sleep

Beispiel:

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);

Der Nachteil ist die zusätzliche Komplexität durch die Verwendung von synchronisiert oder dass alles, was innerhalb von TIME_CONST passiert, unsichtbar ist.

Ich würde gerne wissen, welche anderen Ideen es dafür gibt, Danke!

5voto

Thilo Punkte 248982

Ja, Sie würden Folgendes verwenden wait / notify . Dafür ist sie da.

Oder vielleicht braucht Ihr Zustandsautomat keinen eigenen Thread zu haben. Andere Threads könnten einen update Methode auf den Zustandsautomaten, wenn etwas Interessantes passiert.

2voto

Wenn Sie eine Warteschlange Zustandsautomaten in Umple zu erstellen, wird der Code dafür für Sie generiert. Wenn Sie einen Umple-Zustandsautomaten als Warteschlange angeben, wird speziell ein Thread erstellt, der auf Ereignisse (benannte Methodenaufrufe) wartet. Anderer Code in der Klasse kann gleichzeitig in dem/den ursprünglichen Thread(s) ablaufen. Das Schlüsselwort "queued" sollte direkt vor der Definition des Zustandsautomaten stehen.

Véase http://statemachines.umple.org für weitere Informationen zur Erstellung von Zustandsautomaten in Umple. Sie können Umple in diesem Zusammenhang einfach als einen Präprozessor für Java (und andere Sprachen) betrachten.

1voto

RubenLaguna Punkte 17855

Sie können auch die Funktionen Sperren und Zustand (Java 1.5+). Es ist wie wait/notify und es gibt ein Beispiel in der Javadoc

1voto

alphazero Punkte 26906

Versuchen Sie es mit einem Rohrleitung zwischen dem Ereignisquellen-Thread und dem FSM-Verkörperungsthread. Dies ist für eine Implementierung mit zwei Threads ausreichend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X