Unterbrechnung durch Echtzeitbefehle?

Moch

Bekanntes Mitglied
Hallo,

Ich entwickle derzeit mal wieder an einem Projekt mit, welches sich Multiagenten-Simulationen im Rahmen von Operations Research bedient. Ziel ist die Entwicklung eines eigenen Frameworks für komplexe soziale Simulationen zur Früherkennung und Beurteilung von möglichen Problemen, wie z.B. Aufstände, Hungersnöte, Massenpaniken, Seuchen usw.
Wir entwickeln hierzu ein bereits bestehendes Framework für Multiagenten-Systeme um die nötigen Bestandteile weiter. Später soll der Entwickler mit dem Framework vergleichsweise "einfach" entsprechende Modelle entwickeln können und sich um die Engine selbst nach Möglichkeit keine Gedanken mehr machen müssen.

Zu unseren Anforderungen gehört auch eine Echtzeitsteuerung der Simulation über eine GUI. Diese soll u.A. Schieberegler enthalten, welche direkt bestimmte Parameter anpasst, aber auch über ein Terminal für den direkten Zugriff auf Agenten haben.
Die Schieberegler lassen sich in meiner Vorstellung vergleichsweise einfach umsetzen. Hier sollen direkt Variablen in einer static class verändert, welche damit automatisch Einfluss auf alles nimmt, was diese Variablen verwendet. Diese Änderung kann einfach zu Beginn jedes Zuges in der Simulation erfolgen und ist somit nicht direkt zeitkritisch.

Mehr Kopfzerbrechen bereitet mir jedoch das Terminal. Dieses soll u.A. direkten Zugriff auf Agenten nehmen, Ihre Attribute ändern oder diese töten.
so soll z.B. die Eingabe "kill 12" die Entität mit der ID 12 töten.

Problem hierbei ist: Diese Änderung muss in Echtzeit und umgehend erfolgen, da sie ggf. nicht auf einen neuen Durchlaufen warten kann.
Hier weiß ich jetzt nicht weiter.

Gibt es die Möglichkeit in Java eine Art bedingte Programmunterbrechnung zu erwirken?
Ich stelle mir das etwa so vor:
1. Das Programm läuft normal ab
2. Der User macht eine Eingabe im Termial (in die GUI integriert) <- Programm läuft normal ab
3. Der User bestätigt den Befehl mit Enter <- das laufende Programm unterbricht
4. Der Befehl wird ausgewertet und umgesetzt (oder im Falle eines falsches Befehls eine Warnung ausgegeb). Variablen werden verändert, Objekte entfernt usw.
5. Der Befehl wurde umgesetzt und das Programm läuft mit geänderten Agenten-Attributen weiter.

Die Agenten bzw. Entitäten können einfach referenziert werden: Sie werden bei Programmstart in der globalen static Class in einem Array gespeichert, welches als zentrale Registry fungiert. Das Problem ist jetzt, dass ich nicht weiß, wie ich das laufende Programm zu jederzeit unterbrechen kann, um den Befehl anzunehmen.

Könnt Ihr mir da helfen?

Gruß
Moch
 

Gucky

Top Contributor
Mir fiele jetzt nur die Möglichkeit ein, dass du alle laufenden Threads mit einem wait() unterbrichst, in einem separaten Thread deinen Befehl ausführst und dann mit einem notify() oder notifyAll() die Threads wieder aufweckst.
 

JavaMeister

Gesperrter Benutzer
Ich entwickle derzeit mal wieder an einem Projekt mit, welches sich Multiagenten-Simulationen im Rahmen von Operations Research bedient. Ziel ist die Entwicklung eines eigenen Frameworks für komplexe soziale Simulationen zur Früherkennung und Beurteilung von möglichen Problemen, wie z.B. Aufstände, Hungersnöte, Massenpaniken, Seuchen usw.

Hört sich nach einem coolen Vorhaben an, dass sicher nicht in der Schule sondern von einem Profi durchgeführt wird.

Und dann haben wir 0 Informationen über das zugrundeliegende Framework noch die bisherige Architektur des implementieren Modells.

Statdessen scheint einfach alles "static" zu sein.

Hört sich hier nach naiv implementieren Irgentwas an.

Wenn ich die Zeit habe kill 12 in die Console einzugeben dann ist es egal, ob ich das in der aktuellen iteration oder in de rnächsten ausführe.

Dann muss ich einfach in der nächsten Interation die geänderten Parameter annehmen, als ob sie das Ergebnis der aktuellen Iteration wären.

Da muss man nix anhalten.
 

Moch

Bekanntes Mitglied
Nein, es wird nicht in einer Schule durchgeführt, sondern im Rahmen einer Forschungsarbeit. Von Profis würde ich hier aber auch nicht reden, denn die meisten von uns kommen gerade frisch aus dem Studium und haben gerade erst ihren M.Sc. hinter sich. Dementsprechend fehlt es den meisten von uns an Erfahrung.

Ich hielt Informationen über das zugrundeliegende Framework für nicht notwendig, da ich das ganze für eine allgemeine Java-Frage gehalten habe. Es handelt sich bei dem Framework um eine Eigenentwicklung mit dem wunderschönen Namen MAS (Multi-Agenten-System). Im Wesentlichen stellt es die grundlegende Engine selbst zur Verfügung und bietet Scheduler, die die Aktionen der Agenten planen (in zeitlicher Reihenfolge).
Dem Entwickler eines Modells fällt die Aufgabe zu, die Aktionen der Agenten zu entwickeln und die Agenten mit Attributen zu versehen. Dabei steht ansich die gesamte Bandbreite von Java zu Verfügung. Der Scheduler benötigt lediglich die Methode void action(Simulation sim), welche von ihm gecallt wird, um die Aktionen des Agenten auszuführen.

Bei uns ist auch nicht alles static, sondern eine globale Klasse, welche zentral Variablen und Objekte verfügbar macht.

Ob hier irgendwas egal ist oder nicht, spielt zunächst erstmal keine Rolle, da ich mir die Anforderung auch nicht selbst ausgedacht habe, aber sie umzusetzen habe. Die Anforderung besagt ganz klar, dass das Programm unterbrochen werden soll. Das wurde in der Diskussion nochmals bestätigt, in welcher wir ganz klar gefragt haben, ob es nicht reichen würde, zu Beginn jeder action()-Methode oder auch nur jeder Iteration, auf neue Befehle zu prüfen. Es wurde daraufhin mehrfach betont, dass das Programm zu jederzeit unterbrochen können werden muss.

Aber entschuldigung, dass ich gefragt habe. Ich finde schon irgendwie eine eigene Lösung.
 

Lonsdaleit

Aktives Mitglied
Hi,

die Methode join() der Klasse Thread könnte dir weiterhelfen.
Folgendes ist nur eine spontane Idee für dein Problem:

1. Erzeuge einen Thread (Agent), der die Änderungen an dem Agent durchführen soll.
2. Führe für alle aktiven Threads den Befehl join() auf den Thread aus 1 aus (Agent.join()).
3. Starte den Thread aus 1 (Agent).

Dadurch unterbricht das Programm an sich zwar nicht, aber alle Threads deines Programmes hören auf zu arbeiten bis die Änderungen an Agent durchgeführt wurden.

Es würde dein Problem mit dem "Echtzeiteingriff" in die Simulation lösen.

Gruß
Lonsdaleit
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
H Dienst durch ssh forwarding absichern? Allgemeine Java-Themen 15
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
Y Wie bekomme ich durch getImage an das Image heran? Allgemeine Java-Themen 1
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
I Buchstabe durch seinen Nachfolger ersetzen Allgemeine Java-Themen 29
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
C OpenCl Setup und durch JavaCode ansteuern Allgemeine Java-Themen 17
J Erste Schritte Datenspeicherung durch Java Allgemeine Java-Themen 6
M Hässliche Schrift auf Graphics durch deriveFont Allgemeine Java-Themen 0
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
K Jar/DLL Abhängigkeiten durch User angeben lassen Allgemeine Java-Themen 6
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T AWT AWT-EventQueue-0 Null_Pointer_Exception durch Variable Allgemeine Java-Themen 12
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Quadrieren einer Zahl nur durch Addition Allgemeine Java-Themen 5
L Vererbung If-Else ersetzen durch was? Allgemeine Java-Themen 20
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
B Counting Sort (Sortieren durch Zählen) Allgemeine Java-Themen 13
Z Durch Bäume iterieren Allgemeine Java-Themen 3
G Suchweg durch Binärbaum speichern Allgemeine Java-Themen 4
L Label- & Textfelderzeugung durch Button Allgemeine Java-Themen 1
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
F Live Ticker durch Screenshots Allgemeine Java-Themen 22
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
N Algorithmus durch Workflow Allgemeine Java-Themen 7
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
E Oracle kann durch 0 teilen !?! Allgemeine Java-Themen 7
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
J Java Datei durch Java Datei öffnen Allgemeine Java-Themen 16
M Arraynamen durch Variable festlegen lassen Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
F Slash durch Systembezogenen Fileseparator ersetzen Allgemeine Java-Themen 18
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
D Updaten von Klassen durch jar.exe zerstört diese. Update durch WinRAR gelingt! Allgemeine Java-Themen 2
A SWT Ausgabetext Shellscript durch Java Allgemeine Java-Themen 8
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
fastjack Hardwareinformationen durch Java auslesen Allgemeine Java-Themen 7
S durch Code steppen Allgemeine Java-Themen 7
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
C Markierung durch Maus lesen Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
N Scanner läuft nicht durch Allgemeine Java-Themen 2
F kamera auslösen durch Programm Allgemeine Java-Themen 17
M Maus durch JavaProgramm bewegen Allgemeine Java-Themen 2
Dissi Itext - Anordnung von Elementen durch PDF Writer Allgemeine Java-Themen 2
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
H Performancegewinn durch Mehrfachobjeknutzung Allgemeine Java-Themen 3
N Fehler abfang läuft doppelt durch Allgemeine Java-Themen 2
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
S Testen einer Anwendung durch klicken von Koordinaten Allgemeine Java-Themen 7
N int[] eindeutig durch eine Zahl repräsentieren Allgemeine Java-Themen 12
GilbertGrape Durch JDK debuggen Allgemeine Java-Themen 2
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Schleife durch Button beenden Allgemeine Java-Themen 6
royale Breitendurchlauf / Dijkstra durch Graph, vereinfacht Allgemeine Java-Themen 3
Hawkes Beschädigte Tarballs durch JavaTar Allgemeine Java-Themen 2
X Status Anzeige-durch Thread? Allgemeine Java-Themen 15
4 ich steige einfach nicht durch Allgemeine Java-Themen 5
P Thread Demonstrationr eist durch die Zeit Allgemeine Java-Themen 4
D erstellung einer seitenlangen xml durch ireport Allgemeine Java-Themen 3
R Jar-File vom Linux Desktop durch ancklicken starten? Allgemeine Java-Themen 5
M Java Programm durch Datei Öffnen Allgemeine Java-Themen 6
J IOException durch BufferedWriter.flush() ? Allgemeine Java-Themen 5
J Name eines Strings durch einen String festlegbar? Allgemeine Java-Themen 2
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
J Zweidimensionales Array durch ZwischenArray ersetzen Allgemeine Java-Themen 3
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
J Chars in einem String durch "nichts" ersetzen Allgemeine Java-Themen 3
C Dateien auf Festplatte speichern durch "Durchsuchen-But Allgemeine Java-Themen 3
B VK_? << durch char rausbekommen Allgemeine Java-Themen 8
K Programm durch Tastendruck beenden Allgemeine Java-Themen 4
H Programmerweiterung durch Datei die Funktionen enthält Allgemeine Java-Themen 5
J Kommerzieller Einsatz von Java - Ich blick da nich durch. Allgemeine Java-Themen 14
T Mehrere Dateien byteweise durch stream schieben Allgemeine Java-Themen 9
D Thread durch Mouse-Event beenden Allgemeine Java-Themen 5
D In einem String "\" durch das "\\" erse Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben