Wie man eine zyklische Executive in Java-Code

September 30

Ein zyklischer Executive bietet eine Alternative zum Schreiben einer ausgewachsenen, Echtzeit-Betriebssystem. Es besteht aus einer Endlosschleife, die Gruppen von Aktionen enthält. Jeder Satz ist eine Wartezeit vorangestellt, der steuert, wann die Gruppe seine Aktionen ausführen soll. Der folgende Code ist ein Beispiel:

while(true){warten Sie 3 SekundenWait(3000);eine Netzwerk-Meldung.......warten Sie 2 Sekunden für den vollständigen Empfang der NachrichtWait(2000);der Inhalt der Nachricht zu scannen.......}

Diese Aktion-Sets können oft gleichzeitig ein gewisses Maß an Synchronisierung ausführen. Threads sind in Java einen Mechanismus zum Ausführen von gleichzeitigen Tasks mit Pausen zur Unterstützung bei der Synchronisation.

Anweisungen

Aufgaben zu identifizieren

1 Wählen Sie ein Entwurfsmuster, das am ehesten den Anforderungen Verhalten der Anwendung als eine zyklische Executive gebaut werden. Stellen Sie sicher, dass das Entwurfsmuster den Inhalt der Schleife, aus denen die zyklische Exekutive deckt.

2 Koppeln Sie die Verhaltensweisen des Entwurfsmusters mit den Anwendungsanforderungen. Stellen Sie sicher, dass jede der synchronisierten, zusammen verarbeitet alle Verhaltensweisen beschrieben, die in der Anwendung zugeordnet ist.

3 Identifizieren Sie die Java-spezifische Informationen, aus denen jede des Prozesses Thread-Klassen der Anwendung. Vergewissern Sie sich, so richten Sie eine Synchronisierung-Pause für jeden Prozess, Thread-Klasse versichern richtige Timing zwischen Prozessen und vermeiden anomale Bedingungen wie das läuft. Erstellen Sie Unterstützungsklassen als Daten Austausch Puffer zwischen Prozessen, z. B. Warteschlangen, handeln nach Bedarf. Erstellen Sie eine Log-Stream-Klasse um Protokolle der Ablaufverfolgung der Ausführung jedes Threads des Prozesses zu definieren.

Das Paket zu organisieren

4 Build eine zyklische Exekutive Hauptklasse, die den Prozess instanziiert Thread-Klassen, Sonderunterstützung Klassen und andere erforderliche Initialisierung wie folgt:

Klasse CyclicExec{publicstaticvoid Main (String [] Args){benötigte Ressourcen zu initialisieren.....................................definieren Sie eine Thread-Protokoll-KlasseLogStream ls = neue LogStream();.....................................Unterstützungsklassen initialisieren.....................................MsgQueue sq = neue MsgQueue(...);.....................................Process-Thread-Klassen zu initialisieren.....................................Instanziieren Sie den Process_1-Prozess und definieren seine zugeordneten Threads zuProcess_1 p1 = neue Process_1(...);T_Process_1 = neue Thread(p1);den Thread für Process_1 aktivieren

versuchen Sie{T_Process_1.Start();}Catch (IllegalThreadStateException e){Melden Sie sich eine schlechte Thread starten und beenden.....................................}}}

5 Fügen Sie dem Paket jede des Prozesses Thread-, wie im folgenden Beispiel gezeigt Klassen:

Process_1-Klasse erweitert Thread{Initialisierungöffentliche Process_1(...){richten Sie ein Protokoll für diesen Thread (P_s ist vorab definierten Log-Stream-Objekt)PrintStream p1_s = p_s.make_it(Processs_1_Log_File);Initialisieren Sie den Thread des Prozesses.....................................}.....................................Ausführung - aufgefordert, durch die implizite start() Methode verwendet in der Hauptklassepublic void run(){Kern-Schleifewhile(true){Kernprozess.....................................halten Sie nach dem Ausführen eines Zyklus von den Kernprozessversuchen Sie{Sleep(Process_1_Wait);}fangen Sie (InterruptedException e){Melden Sie sich eine Pause-Ausnahme.......................................}}}}

6 Bauen Sie die Unterstützungsklassen, die messaging Puffer zwischen Prozess Threads mit seinen Puffer-Zugriffsmethoden qualifiziert definieren als synchronisiert, wie im folgenden Beispiel gezeigt:

synchronisierte publicbyte PushIt (Itm Byte){.............................................................}

7 Bau eine besondere Klasse, die Log-Dateien, die das Verhalten des Prozesses Ablaufverfolgung definiert, Thread-Klassen, wie:

Klasse LogStream{Private boolesche LogState;Klasseninitialisiereröffentliche LogStream (String LogStateIn){Dies. LogState = False;if(LogStateIn.Equals("yes")) dies. LogState = True;}Erstellen Sie einen Protokollstream in eine Dateiöffentliche PrintStream Make_it (String LogLocation){PrintStream This1;String This2;if(this. LogState){This2 = neue String(LogLocation);}sonst{This2 = neue String("/dev/null");}versuchen Sie{This1 = neue PrintStream (neue FileOutputStream(This2,true));}Catch (Exception e){This1 = Null;}Rückkehr This1;}}

Test und liefern

8 Definieren Sie eine Sequenz von Testszenarien für beide extreme und normalen Betriebsbedingungen zu umfassen, um die Synchronisierung zwischen der Prozessthreads verfeinern.

9 Überprüfen Sie die Prozess-Thread-Protokolle, um sicherzustellen, dass der Prozess Thread-Klassen betrieben wie erwartet. Stellen Sie sicher, dass keine Rennen oder ähnlichen Bedingungen aufgetreten ist.

10 Bereiten Sie das Anwendungspaket Lieferung durch den Klassendateien (Executable) für jede der Prozessthreads einschließlich, der Hauptklasse, messaging Unterstützungsklassen und Log-stream-Klasse. Enthalten Sie Skripts, die entladen und richten Sie die Class-Dateien sowie zum Initialisieren des Verzeichnisses, in dem Prozess-Thread-Log-Dateien gefunden werden.

Tipps & Warnungen

  • Erstellen Sie vor einer vollständigen Bauantrag und nach Ermittlung der Prozessthreads eine Reihe von Skelett-Prozess-Klassen und die Hauptklasse. Diese Klassen haben nur die anhalten-Einstellungen für jeden Prozess-Thread-Klasse. Testen Sie die Leistungsfähigkeit der vorgeschlagenen Design in einer Zielumgebung--bei der Festlegung der erste synchronisierte anhalten Perioden, z. B. zu verwenden. Sie können sie später bei der Ausführung von Testszenarien für die volle Anwendung verfeinern.