Thread beenden

Status
Nicht offen für weitere Antworten.

Fabian23

Aktives Mitglied
Hallo Forum,

ich habe Threads, die, wenn sie nicht mehr gebraucht werden, sterben sollen. Ob das der Fall ist, also ob sie noch gebraucht werden oder nicht, kann aber nur innerhalb des Threads entschieden werden. Der Thread muss sich also selber beenden

Wie mache ich das am besten?

Ich dachte mir zuerst, dann, wenn der Thread nichts mehr zu tun hat, er automatisch stirbt. Ist das der Fall? Scheint nämlich nicht so ganz zu funktionieren. In dem Thread habe ich eine While-Schleife. Die könnte ich ja verlassen, wenn der Thread nicht mehr gebraucht wird. Trotzdem scheint er aber weiter zu arbeiten.

Kann mir da jemand bei helfen?


Gruß,
Fabian
 
Fabian23 hat gesagt.:
...Ich dachte mir zuerst, dann, wenn der Thread nichts mehr zu tun hat, er automatisch stirbt. Ist das der Fall? ...
Im Prinzip ist das der Fall: wennste aus der run() Methode raus bist, dann ist alles vorbei.
 
das hab ich auch schonmal gebraucht...

Code:
//...
boolean can = true;
do
{
    //...
   if( /* whatever /* ) can = false;
   //...
}while(can);
//...

soweit ich das bemerkt habe, huppt der da raus, bin mir aber net sicher... iss nur die logische sicht der sache.

MfG dNoob
 
Code:
   if( /* whatever */ ) can = false;
 
Huhu!

Also so ganz wird der Thread anscheinend nicht beendet.

Code:
public class ServerListener extends Thread {
	
	private ServerSocket serverSocket = null;
	private PrintWriter  printWriter  = null;
	
	public ServerListener() {}
	
	public void run() {
		try {
			this.serverSocket = new ServerSocket(6666);
			
			while(true) {	
				if (this.isInterrupted()) {
					break;
				}
				
				if (this.serverSocket.isClosed()) {
					this.interrupt();
				}
				
				Thread.sleep(5);
				
				Socket clientSocket = this.serverSocket.accept();
				this.printWriter    = new PrintWriter(clientSocket.getOutputStream(), true);
													
				Thread clientListener = new Thread(new ServerClientListener(clientSocket));
				clientListener.start();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
                        this.closeSocket();
			this.interrupt();
		} catch (IOException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Server auf Port 6666 konnte nicht geöffnet werden");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.closeSocket();
		}
		
	}
		
	public void closeSocket() {
		if (this.serverSocket != null) {
			try {					
				this.serverSocket.close();
				this.serverSocket = null;
			} catch (Exception e) {}
		}

	}
}

In dieser Methode wird für jeden ankommenden Client ein neuer Thread gestartet, damit ich mit ihm kommunizieren kann.
Wenn der Server jetzt gestoppt wird, dann möchte ich gerne diesen ServerListener Thread beenden und das Socket wieder freigeben.
Das Socket geben ich an der Stelle wieder frei, wenn die InterruptedException geworfen wird. Diese wird aber nicht immer geworfen. Ist das ein Zeichen, dass der Thread nicht interrupted wird oder was mache ich falsch?

Wie kann ich denn das Socket wieder freigeben und dann evtl. erst den Thread interrupten?


Gruß,
Fabian
 
Diese Exception wird nur geworfen, wenn der Thread gerade "sleep" aufgerufen hat, ansonsten kommt entweder garkeine Exception, oder das Socket.accept dürfte vielleicht irgendeine IOException werfen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben