Netzwerkprogramm sauber beenden

F

Firephoenix

Gast
Hi,
ich schraube gerade an einer kleinen Client-Server anwendung die auf normalen Sockets basiert,
im Server benutze ich im Moment einen ExecutorService, im Client einen normalen Thread/Runnable um den Input der anderen Seite auszulesen.
Die Threads blocken durch die read-operationen natürlich regelmäßig (auch wenn ich die jeweilige Anwendung beende).

Wie sieht denn in so einem Fall der saubere Weg aus die Anwendung zu beenden?
(speichern etc ist erledigt, ich muss nur die Threads loswerden)
-Setze ich alle Threads für die inputs als deamon und lasse der JVM die arbeit die abzuschießen wenn ich meine Anwendung beende?
-Ist es sinnvoller die Threads manuell zu beenden (interrupt?).
 

HoaX

Top Contributor
Ich würde die Threads beenden wenn keine Verbindung mehr da ist. Beim Beendend close() vom Socket aufrufen und gut is.
 
D

Disconnect

Gast
Ich persönlich löse dies bei meinen Netzwerk-Programmen so :

Der Client sendet an den Server ein "disconnect". Dadurch reagiert das read() vom Server und beginnt den Thrad aufzuräumen. Damit das funktioniert muss natürlich das Aufräumen im selben Thread wie read() erfolgen damit der Server nicht wieder im read() hängen bleibt. Nach dem der Server nun alle Referenzen aufgeräumt hat (sowohl vom Thread aus auf andere Objekte als auch von außen auf den Thread und dessen Objekte selbst) sendet der Server an den Client ebenfalls "disconnect" und schließt die Streams sowie den Socket. Danach wird über return der Thread beendet und für den GC freigegeben. Das "disconnect" an den Client hat lediglich die Aufgabe das dort ebenfalls read() getriggert wird so das der Client den read()-Thread ebenfalls sauber beenden kann.

Ein "gewaltsames killen" durch interrupt() halte ich für schlecht da es Missbrauch einer Exception ist was man vermeiden sollte. Ob man beim Client den read()-Thread als Deamon setzen sollte hängt davon ab ob nach dem DC der Client beendet wird oder ob dieser weiterläuft um z.B. eine andere Verbindung aufzubauen.
 
F

Firephoenix

Gast
Hi,
hatte mir sogar schon bei der Entwicklung ein Disconnect-Paket definiert und nie benutzt :eek:

Mit dem Paket aus dem read-lock zu springen, das socket zu schließen (schließt ja auch alle aufgesetzten streams) und die referenzen auf den thread und sonstige ressourcen zu entfernen hat wunderbar funktioniert.

Thema erledigt und danke nochmal.
 

Ähnliche Java Themen


Oben