Hvordan kode en syklisk direktør i Java

En syklisk utøvende gir et alternativ til å skrive en fullverdig, sanntids operativsystem. Den består av en uendelig løkke som inneholder sett med handlinger. Hvert sett kommer etter en venteperiode som styrer når settet er å utføre sine handlinger. Følgende kode gir et eksempel:

while (true)
{
// Vente 3 sekunder
vente (3000);
// Motta en nettverksmelding
.......
// Vente 2 sekunder for fullstendig mottak av meldingen
vente (2000);
// Skanne innholdet i meldingen
.......
}

Disse actionsettene kan ofte kjøre samtidig med en viss grad av synkronisering. I Java, tråder er en mekanisme for å kjøre samtidige oppgaver med pauser for å bistå i synkronisering.

Bruksanvisning

Identifiser Oppgaver

1 Velg et design mønster som er nærmest atferds kravene i programmet som skal bygges som en syklisk executive. Sørg for at design mønster dekker innholdet av loopen som utgjør den sykliske executive.

2 Par atferd av design mønster med de krav til søknaden. Sørg for at hver av de synkroniserte, samarbeidende prosesser knyttet til hver av atferd som er beskrevet i søknaden.

3 Identifiser Java-spesifikke detaljer som utgjør hver av prosessen Tråd klasser av søknaden. Sørg for å sette opp en pause synkronisering for hver prosess tråden klasse for å sikre riktig timing mellom prosesser og unngå avvikende forhold som racing. Opprett støtte klasser for å fungere som datautvekslings buffere mellom prosesser, for eksempel køer etter behov. Lag en logg stream klasse å definere logger sporing gjennomføringen av hver prosess tråd.

Organisere Package

4 Bygg en syklisk utøvende hoved klasse som instantiates prosessTråd klasser, spesielle støtteklasser og annen nødvendig initialisering, for eksempel følgende:

klasse CyclicExec
{
public static void main (String [] args)
{
// Initial nødvendige ressurser
.....................................
// Definere en tråd log klasse
LogStream ls = ny LogStream ();
.....................................
// Initial støtte klasser
.....................................
MsgQueue kvm = ny MsgQueue (....);
.....................................
// Initial prosessen tråden klasser
.....................................
// Instantiate Process_1 prosessen og definere dens tilhørende tråden
Process_1 p1 = ny Process_1 (......);
T_Process_1 = ny tråd (p1);
// Aktivere tråden for Process_1

prøve
{
T_Process_1.start ();
}
fangst (IllegalThreadStateException e)
{
// Logge en dårlig tråd start og exit
.....................................
}
}
}

5 Legg til pakken hver av prosessen Tråd klasser, som følgende eksempel viser:

klasse Process_1 strekker tråden
{
// initialisering
offentlig Process_1 (....)
{
// Sette opp en logg for denne tråden (p_s er forhåndsdefinert loggstrømmen objekt)
Print p1_s = p_s.make_it (Processs_1_Log_File);
// Initialisere prosessen tråden
.....................................
}
.....................................
// Utførelse - bedt gjennom den implisitte start () metode som brukes i hovedklassen
public void run ()
{
// Kjerne sløyfe
while (true)
{
// Kjerneprosess
.....................................
// Pause etter å ha kjørt en syklus av kjerneprosess
prøve
{
søvn (Process_1_Wait);
}
fangst (InterruptedException e)
{
// Logge en pause unntak
.......................................
}
}
}
}

6 Bygg støtte klasser som definerer meldings buffere mellom prosess Tråder med sine buffer tilgang metoder kvalifisert som synkroniseres, som følgende eksempel viser:

offentlig synkronisert byte PushIt (byte ITM)
{
.................................................. ...........
}

7 Bygg en spesiell klasse som definerer loggfilene sporing oppførselen til prosessen Tråd klasser, for eksempel:

klasse LogStream
{
private boolean LogState;
// Klasse initializer
offentlig LogStream (String LogStateIn)
{
this.LogState = false;
if (LogStateIn.equals ( "ja")) this.LogState = true;
}
// Opprette en logg strøm til en fil
offentlig Print make_it (String LogLocation)
{
Print This1;
String this2;
if (this.LogState)
{
This2 = new String (LogLocation);
}
ellers
{
This2 = new String ( "/ dev / null");
}
prøve
{
This1 = new Print (new Fileoutputstream (this2, true));
}
catch (Exception e)
{
This1 = null;
}
tilbake This1;
}
}

Test and Deliver

8 Definer en sekvens av test scenarier for å dekke både ekstreme og normale driftsforhold for å avgrense synkronisering mellom prosesstråder.

9 Gjennomgå prosessen tråden logger for å sørge for at prosessen Tråd klasser drives som forventet. Sørg for at ingen racing eller lignende forhold inntraff.

10 Forbered søknaden levering pakken ved å inkludere klasse (kjørbare filer) for hver av prosess tråder, den viktigste klassen, messaging støtte klasser og logge stream klasse. Inkluder skript som losse og sette opp klassen filene samt initial katalogen der prosessen tråden loggfiler skal ligge.

Hint

  • Før bygge en full søknad og etter å identifisere prosesstråder, lage et sett med skjelett prosess klasser og viktigste klassen. Disse klassene har bare pause innstillinger for hver prosess tråd klasse. Bruk dem til å teste ytelsen til den foreslåtte design i en målmiljøet - i å sette første synkroniserte pause perioder, for eksempel. Du kan avgrense dem senere når du kjører testscenarier for hele programmet.