# Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz



## tonmann (29. Dez 2011)

Ich bin nicht sicher, ob es tatsächlich an meiner Java-Implementation liegt, oder ob es unter Umständen an dem Programm liegt, zu dem ich verbinden möchte...
Ich verwende Win7x86 mit aktueller java sdk/runtime

Der Server ist folgendes Programm: rcssserver3d mit SimSpark 0.6.5. Simulationsserver der Robocup-Liga (ist allerdings in c++ geschrieben und liegt nur als ausführbare datei vor)

Nun gibt es folgendes Problem:

Da ich einen Evolutionsalgorithmus durchführe, habe ich zZ 10 Threads, die auf einem Server verbinden sollen: 

gekürzter quelltext der Verbindungen:

```
//main loop
		while ((!checkFitness(iterations)) && (iterations < _maxiterations)) {
			TimeUnit unit = TimeUnit.SECONDS;
			Iterator<Future<double[]>> it= executor.invokeAll(tasks, 30, unit).listIterator();
			int i = 0;
			while (it.hasNext()) {
				fitness[i] = computeFitness(it.next().get());
			}
			decideGeneBase(fitness, false);
		iterations++;
		}
```

Während es mit nur einem Thread wunderbar funktioniert, schlägt das ganze irgendwie fehl, wenn ich es mit mehreren versuche, gibts Fehler. Die Threads laufen zwar, wenn sie aber versuchen über die Sockets mit dem Server zu verbinden, führt das zum Absturz des Servers.

Ich sitze schon einige Zeit daran, aber mir will keine Idee kommen, wie ich an das Problem herangehen kann. Ich wäre sehr dankbar, wenn jemand eine Lösung hätte - auch vermutungen sind mir recht.


Edit: Die Implementation der Sockets ist Fremdsoftware, die normal auch problemlos funktioniert, wenn ich die Agenten manuell starte...
Edit: das Agentenframework ist das Magma3DFramework des RoboCup-Teams der Hochschule Offenburg


----------



## tonmann (29. Dez 2011)

ich habs jetzt nochmal mit submit(task) probiert, an den thread aufrufen scheints nicht zu liegen... 


```
ArrayList<Future<double[]>> alf = new ArrayList<Future<double[]>>();
		//main loop
		while ((!checkFitness(iterations)) && (iterations < _maxiterations)) {
			System.out.println("do iterations number " + iterations);
			ArrayList<RobotAgent> tasks = new ArrayList<RobotAgent>();
			for (int i = 0; i < maxit; i++) {
				for (int j = 0; j < maxit; j++) {
					double[] pos = {1,1};
					RobotAgent task = new RobotAgent(3100+i, pos, grid[i*maxit+j], j);
					//tasks.add(task);
					alf.add(executor.submit(task));
				}
			}
			
			TimeUnit unit = TimeUnit.SECONDS;
//			Iterator<Future<double[]>> it= executor.invokeAll(tasks, 30, unit).listIterator();
			int i = 0;
//			while (it.hasNext()) {
//				fitness[i] = computeFitness(it.next().get());
//			}
			executor.awaitTermination(10, unit);
			for (Iterator<Future<double[]>> it = alf.iterator(); it.hasNext();) {
				Future<double[]> f = it.next();
				fitness[i] = computeFitness(f.get());
				i++;
			}
			decideGeneBase(fitness, false);
		iterations++;
		}
```


Brauche ich jetzt dieses "executor.awaitTermination()" überhaupt? oder wird beim aufruf von Future.get() gewartet, bis die Berechnung abgeschlossen ist?


----------



## tonmann (1. Jan 2012)

Naja, es scheint, als lägen die probleme an der fremdsoftware und weder an den java-threads noch an den Socketverbindungen. trotzdem danke


----------

