Hallo an alle,
ich schreibe zur Zeit an meiner Masterarbeit und will eine kleine Echtzeitsimulation erstellen. Bei dieser habe ich Probleme die verschiedenen Threads zu synchronisieren. Ich versuche mal mein Problem möglichst simpel darzustellen:
Ich habe ein Objekt Anlage von welchem ich 100 Instanzen erstelle. Jede Anlage verfügt über eine Fehlerzeitreihe (ein Jahr), dargestellt durch ein zweidimensionales Array (Tag, Stunde). Kein Fehler wird durch 0 und ein Fehler durch die Zahl 1 dargestellt. Weiter verfügt jede Anlage über einen Thread in welchem das Array durchlaufen wird und bei einem Fehler das dazugehörige Fehlerobjekt in einen gemeinsamen Stapel schreibt.
Dann gibt es ein Objekt Reperaturcrew welches in einem eigenen Thread den Stapel überwacht. Findet es in dem Stapel einen neuen Fehler, rückt die Crew zur Anlage aus und repariert diese. Ist die Reperatur erfolgreich abgeschlossen steht die Crew wieder zur Verfügung und kann den nächsten Fehler beheben, bzw. auf einen Warten.
Das ist jetzt eine sehr sehr vereinfachte darstellung dessen was das Programm machen soll, aber ich glaube im Kern verständlich. Falls nicht: Löchert mich!
Meine Frage ist jetzt wie ich es schaffe die Threads sinnvoll zu synchronisieren. Ich möchte gerne das jede Anlage erst einmeal Stunde 1 an Tag 1 anschaut ob ein Fehler vorliegt. Dann soll die Reperaturcrew schauen ob Fehler im Stapel vorhanden sind. Dann sind wieder die Anlagen an der Reihe zu schauen: Stunde 2 Tag 1 usw.
Momentan passiert es, dass z.B Anlage 72 einen Fehler an Tag 2 Stunde 24 in den Stapel schreibt und danach Anlage 12 einen Fehler welcher an Tag 1 Stunde 2. Der zweite Fehler hätte also vor den ersten Fehler in den Stapel geschrieben werden müssen.
Wenn ich einen sleep(1) in die Threads schreibe bekomme ich zwar das gewünschte Ergebnis, aber die Laufzeit ist dann halt total fürn Ar...... ;(
Im folgenden noch kurze (vereinfachte) Codebeispiele
Der Thread der Anlagen
Hier der Thread der Reparaturcrew
Vielleicht hat ja einer von Euch eine gute Idee..
Liebe Grüße
Nico
ich schreibe zur Zeit an meiner Masterarbeit und will eine kleine Echtzeitsimulation erstellen. Bei dieser habe ich Probleme die verschiedenen Threads zu synchronisieren. Ich versuche mal mein Problem möglichst simpel darzustellen:
Ich habe ein Objekt Anlage von welchem ich 100 Instanzen erstelle. Jede Anlage verfügt über eine Fehlerzeitreihe (ein Jahr), dargestellt durch ein zweidimensionales Array (Tag, Stunde). Kein Fehler wird durch 0 und ein Fehler durch die Zahl 1 dargestellt. Weiter verfügt jede Anlage über einen Thread in welchem das Array durchlaufen wird und bei einem Fehler das dazugehörige Fehlerobjekt in einen gemeinsamen Stapel schreibt.
Dann gibt es ein Objekt Reperaturcrew welches in einem eigenen Thread den Stapel überwacht. Findet es in dem Stapel einen neuen Fehler, rückt die Crew zur Anlage aus und repariert diese. Ist die Reperatur erfolgreich abgeschlossen steht die Crew wieder zur Verfügung und kann den nächsten Fehler beheben, bzw. auf einen Warten.
Das ist jetzt eine sehr sehr vereinfachte darstellung dessen was das Programm machen soll, aber ich glaube im Kern verständlich. Falls nicht: Löchert mich!
Meine Frage ist jetzt wie ich es schaffe die Threads sinnvoll zu synchronisieren. Ich möchte gerne das jede Anlage erst einmeal Stunde 1 an Tag 1 anschaut ob ein Fehler vorliegt. Dann soll die Reperaturcrew schauen ob Fehler im Stapel vorhanden sind. Dann sind wieder die Anlagen an der Reihe zu schauen: Stunde 2 Tag 1 usw.
Momentan passiert es, dass z.B Anlage 72 einen Fehler an Tag 2 Stunde 24 in den Stapel schreibt und danach Anlage 12 einen Fehler welcher an Tag 1 Stunde 2. Der zweite Fehler hätte also vor den ersten Fehler in den Stapel geschrieben werden müssen.
Wenn ich einen sleep(1) in die Threads schreibe bekomme ich zwar das gewünschte Ergebnis, aber die Laufzeit ist dann halt total fürn Ar...... ;(
Im folgenden noch kurze (vereinfachte) Codebeispiele
Der Thread der Anlagen
Java:
public void run(){
for(int j=0;j<365;j++){
for(int k=0;k<24;k++){
if(fehlerreihe[j][k]==1){list.add(new Fehler(this.id,i,j,k,1));
}
try {
sleep(0); //wenn ich hier 1 einsetzt funktionier es wunderbar
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
list.fertig=false;
}
Hier der Thread der Reparaturcrew
Java:
public void run(){
while(list.fertig){
try {
sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(fehlerstack.list.size()>0){
starteReparatur(list.get(0));
list.remove(0);
}
}
}
Vielleicht hat ja einer von Euch eine gute Idee..
Liebe Grüße
Nico
Zuletzt bearbeitet: