Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten

KICKinYaFACE

Mitglied
Hallo Zusammen,

ich sitze jetzt schon seit einer Woche an einem Problem/Bug, den ich einfach nicht beheben kann. Ich schildere Mal kurz den Hintergrund:

Momentan arbeite ich in einem Team daran, eine Künstliche Intelligenz für die RoboCup 2D Simulation League zu erstellen. Also eine KI für Fußballspieler. (Das ganze geschieht im Rahmen einer Projektarbeit für die Uni)

Diese Fußballspieler, müssen auf den Rechnern als eigene Prozesse laufen, also pro Prozess ein Fußballspieler (Die Regeln sehen das so vor... )
Programmiertechnisch stehen diese Spieler schon bereit. Werden die Spieler erstellt, verbinden Sie sich mit einem Server, tauschen Informationen mit dem Server aus, parsen einige Informationen usw.
Die Kommunikation mit dem Server und der Parser laufen innerhalb dieser Spieler in Threads ab. Diese werden durchgehend miteinander Synchronisiert.

Momentan sieht es so aus, dass man die Spieler folgendermaßen startet:

Java:
 public class GeneralAgentTest {
	
	public static void main(String [] args){

                 Thread thread = new Thread(new HexagonRunner("127.0.0.1",6000,"UnitedTestors",-30,-15));
                           // IP, Port, Teamname, Startpositionen X und Y
thread.start();
}
}

Auf diese Weise erstellen wir uns einen Spieler, welcher sich dann mit dem Server verbindet und die ganzen Threads ständig durchläuft. Die einzige spielerische Aktion, die dieser Spieler durchführt, ist sich durchgehend zu drehen. (Natürlich nur zu Testzwecken 😀 ) Das funktioniert soweit auch alles tadellos.

Das Problem:
Wie bereits angesprochen, müssen diese Spieler als eigene Prozesse auf dem Rechner laufen.
Das habe ich folgendermaßen mit dem Processbuilder "versucht":

Java:
public void execute(Class klasse, int a, String str, String team, String x,
			String y) {

		String javaHome = System.getProperty("java.home");
		String javaBin = javaHome + File.separator + "bin" + File.separator
				+ "java";
		String classpath = System.getProperty("java.class.path");
		String className = klasse.getCanonicalName();

		ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath,
				className, ip, port, team, str, x, y);

		try {
			process[a] = builder.start();
			System.out.println("Should started");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("failed");
		}
	
	}

Diese Methode wird in einer anderen Methode innerhalb einer Schleife aufgerufen und bekommt als Parameter Informationen aus TextFields übergeben. Die Klasse die aufgerufen wird, sieht so ähnlich aus wie in meinem ersten Codebeispiel. Der einzige Unterschied ist, dass beim Aufruf Parameter übergeben werden, welche lediglich zum Erstellen eines "HexagonRunners" verwendet werden.

Das funktioniert soweit auch "ganz okay", nur leider nicht ganz wie es soll.
Die Prozesse werden erstellt, die Spieler verbinden sich mit dem Server, führen ein Mal den Befehl zum drehen aus, und ab diesem Moment stehen sie still.
Die Prozesse bleiben geöffnet, arbeiten anscheinend auch (ziehen ordentlich CPU), sind noch immer mit dem Server verbunden, aber es tut sich einfach nichts mehr.

Ich weiß einfach nicht woran es liegt. Ich hab mich schon durch einige andere Foren gelesen und verschiedenes ausprobiert. Zuletzt hängen geblieben bin ich bei der Klasse ExecutorService. Diese sollte eigentlich Abhilfe schaffen. Das Ganze hat aber nicht funktioniert, weil der Fehler entweder wo anders liegt oder ich zu doof bin den Executor richtig zu verwenden.


Soviel zu meiner Problemstellung, wollte meine Angelegenheit etwas genauer formulieren.
Ich hoffe, mir kann bei meinem Problem geholfen werden. 🙁

Bin für alle Vorschläge offen.


Grüße, kick
 
Hallo Kick

Was meinst du genau mit es tut sich nichts mehr? Ist es möglich, dass du eine Reaktion auf der Konsole wartest (System.out.println() oder ähnlich) und da nichts passiert?

Falls ja - hast du den Error- und InputStream von den Prozessen korrekt umgeleitet? (Siehe z.B. java - ProcessBuilder: Forwarding stdout and stderr of started processes without blocking the main thread - Stack Overflow, die Antwort mit dem StreamGobbler)

Auch wenn der Prozess noch andere Dinge tun sollte - wenn die Streams nicht umgeleitet/ausgelesen werden, kann dies dazu führen, dass der Prozess hängt.


Freundliche Grüsse
CptSocket
 
Hallo CptSocket,

auf eine Ausgabe auf der Konsole habe ich eigentlich nicht gewartet, hat aber trotzdem geholfen diesen Gobbler mit einzubauen 🙂 Es scheint so, als würden sich die Threads ab einem bestimmten Durchlauf gegenseitig überholen und dann klappt das mit der Synchronisation nicht mehr so ganz wie gedacht.

Die eigentliche Reaktion die ich erwartet habe war, dass sich der Spieler auf dem Spielfeld durchgehend dreht. Dafür habe ich einen sogenannten ServerMonitor, welcher die Momentansituation von dem Server grafisch darstellt. Auf diesem Monitor schaut man sich letztendlich dann auch das Spiel an.

Ich habe jetzt eben das Problem, dass die Spieler auf dem Monitor zu sehen sind, sie sich aber nicht drehen. Dies ist aber eben nur der Fall, wenn ich die Spieler über eigene Prozesse starte. Wenn ich direkt in meiner IDE (Eclipse) die Klasse zum erstellen der Spieler starte, läuft alles wunderbar.

Grüße
kick
 
Heey, es läuft 😀 😀


Es scheint so, als würden sich die Threads gegenseitig blockieren, eben weil sie keine Ausgabemöglichkeiten hatten.
Ich habe jetzt 3 Gobbler in meiner Klasse drin für: Error, Output und Input.
Jetzt drehen sich alle Spieler durchgehend im Kreis 🙂

Super, danke! Wäre ich mal sofort hier hin gekommen 😀

Liebe Grüße
kick
 

Neue Themen


Zurück
Oben