Warum wird der Thread nicht beendet ?

carom

Mitglied
Hallo!

Ich wollte versuchen, einen Thread "auslaufen" zu lassen, sprich in der run-Methode wird eine Schleife in Abhängigkeit eines Flags durchlaufen. Wenn dieses Flag nicht mehr zutrifft, so müsste die Schleife doch verlassen werden, die run-Methode am Ende ankommen und der Thread sich selbst beenden - oder nicht?

Java:
public class Test implements Runnable {

	private int port;
	private volatile boolean running;
	
	public Test(int port) {
		this.port = port;
		this.running = false;
	}

	@Override
	public void run() {
		
	    running = true;
		
		ServerSocket server = null;
		Socket client = null;

		try{
			server = new ServerSocket(port); 
		} catch (IOException e) {
			System.out.println("Socketserver could not be created on port " + port + ", System exits");
			System.exit(-1);
		}
		
		while(running) {
			try{
				client = server.accept();
				PrintWriter out = new PrintWriter(client.getOutputStream(), true);
				out.println("Hello Client");
				out.close();
			} catch (IOException e) {
				System.out.println(t.getName() + ": Client accept failed, continue..");
			}
		}	
	}
	
	public void exitServer() {
		running = false;
	}

}

In meiner Main-Methode an anderer Stelle habe ich:

Java:
Test test = new Test(1000);
new Thread(test).start();
test.exitServer();

Der Thread wird aber nie beendet.
Ich bin mir übrigens bewusst, dass die client.accept()-Methode blockierend ist und das aufrufen von exitServer so oder so ohne Effekt wäre, solange nicht ein Client connectet und die Blockierung aufhebt, damit die Schleife weiterlaufen kann und das Flag in der Bedingung geprüft wird.

Allerdings kann ich das oben gepostete Programm starten und erst 10 Sekunden später einen Client connecten lassen (wenn das Flag also definitiv auf false ist) - das Programm müsse ja dann nach dem ersten Client abbrechen, mein Client kann sich aber beliebig oft verbinden und bekommt beliebig oft das "Hello World" zurück..

woran könnte das liegen? Vielen Dank!
 
Zuletzt bearbeitet:
Durch
Code:
while(running)
hast du ja eine Endlosschleife. Der wiederholt darin immer wieder die accept Methode... Nunja dadurch kannst dann eben unendlich oft connecten. Probiers mal, sobald du die Message geschickt hast, running auf false zu setzen, und nicht in der main.
 
Vielen Dank erstmal,

ja, die Endlosschleife ist aber beabsichtigt und der Thread soll von außen unterbrochen werden. Die Idee dahinter ist ja, dass die Endlosschleife eigentlich keine mehr ist, sobald das Flag verändert wird.

Die Idee habe ich übrigens hier her: Java Standard: Threads ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

Da wird zwar die threadklasse direkt und nicht das Interface runnable benutzt, aber ansonsten sehe ich da kein Unterschied.
 
Beim Aufruf von deiner run-Methode wird die running-Variable automatisch auf true gesetzt.
while(running) = while(true) also eine Endlosschleife

Edit: vergiss es, hab deinen Post erst nach dem Schreiben gesehen 🙂
 
Danke, ja ich weiß 😀

Schaut euch die verlinkte Literatur an:

Java:
 public void run()
  {    
    running = true;
 
    while(running == true)
    {
      System.out.println(getState());
    }   
  }

Die Variable running ist zwar true, wird aber von außen auf false gesetzt.
 
Nur überflogen, aber bei
Code:
Test test = new Test(1000);
new Thread(test).start();
test.exitServer();
kann exitServer ausgeführt werden, BEVOR der Thread gestartet wird. Bei sowas wie
Code:
Test test = new Test(1000);
new Thread(test).start();
Thread.sleep(einBißchen);
test.exitServer();
sollte es gehen. Muss man sich halt ggf. eine schönere Lösung dafür überlegen...
 
Ich hab auch schon den Thread eine "started" variable setzen lassen damit er auf keinen Fall gestopt wurde bevor er startete.

die wurde dann natürlich mit
Java:
while(!thread.started()]){}

abgefragt 😀
 

Zurück
Oben