select() ohne NIO - oder wie Worker-Thread sauber beenden?

Status
Nicht offen für weitere Antworten.

thre

Mitglied
Hi,

ich habe folgendes Problem. Ich habe eine Applikation, in der ein Worker-Thread ein Netzwerkprotokoll Daten bearbeitet. Diesen will ich (z.B. beim Schließen der Applikation) sauber beenden. Hätte ich ein C-Programm, würde ich so vorgehen, dass ich im Thread immer mittels select() und Timeout von z.B. 50ms nachschaue, ob Daten da sind. Wenn das zurückkehrt, würde ich erstmal eine Statusvariable checken, ob ich den Thread beenden soll. Erst dann würde ich auswerten, ob select() nun zurückgegeben hat, ob Daten da sind oder nicht und diese dann entweder bearbeiten oder weiter auf Daten warten.

Dummerweise kann ich mit herkömmlicher I/O in Java den select()-Aufruf nicht simulieren. Zumindest ist mir nichts eingefallen. NIO kann ich nicht verwenden, weil SSL im Spiel ist uns es leider keinen SslSocketChannel gibt (nur eine kommerzielle Implementierung), und selber sowas schreiben kann ich nicht, dazu ist SslEngine zu kompliziert.

Der einzige Weg, den Thread zu beenden, der mir einfällt, ist den Socket zu schließen und im Thread auf eine Exception zu warten. Aber das erscheint mir alles andere als elegant ......

Hat jemand einen Hinweis, wie ich sinnvoll mit herkömmlichen Mitteln den select()-Aufruf simulieren kann? Oder einen anderen eleganten Weg, den Thread zu beenden?


Thomas
 

thre

Mitglied
Hmm, ich sag ja, die API dieser Klasse ist mir zu kompliziert. Außerdem möchte ich lieber mit der "alten" I/O-Bibliothek arbeiten.
 
G

Guest

Gast
Am ende dews geposteten Artikels ist der komplette Code angehängt. Leichter gehts nicht mehr
 

thre

Mitglied
Trotzdem suche ich nach einer Möglichkeit, das Problem mit der klassischen I/O-Bibliothek zu lösen. Selbst wenn ich den Source komplett verwende, bläht der meinen Code nur unnötig auf. Außerdem habe ich schon seitenweise Code, den ich nicht auf NIO umstellen möchte.
 

sparrow

Top Contributor
Sehe ich das richitig, dass es sich hierbei um den Thread handelt der auf dem Port lauscht und die eingehenden Verbindungen zur Bearbeitung weiter gibt?

Ich würde in dem Fall den Socket auch einfach schließen und dann in der Behandlung der Exception eine Statusvariable abrufen ob das Programm nun beendet werden soll oder ob dieser Fehler irgendwo anders aufgetreten ist. Soll das Programm beendet werden läuft der Thread aus, ansonsten wird der Socket wieder geöffnet.

Ich finde Exceptions sind nichts schlimmes, solange man sie nicht ignoriert.


Gruß
Sparrow
 

thre

Mitglied
Es ist eine Client-Applikation, es werden also keine eingehenden Verbindungen entgegengenommen, sondern die Verbindung besteht schon. Es handelt sich nur um einen Thread, der im Hintergrund arbeitet, um halt die GUI nicht zu blockieren.

Im Moment sieht mein Weg genau so aus, wie du ihn beschreibst. Ich finde es nur irgendwie unsauber. In der Vergangenheit haben wir nämlich auch schon die Erfahrungen mit manchen JVMs gemacht, dass im Worker-Thread nämlich keine Exception ausgelöst wurde, wenn der Socket aus einem anderen Thread heraus geschlossen wurde. Das war zwar ein Bug in der alten Netscape-JVM, aber wer garantiert, dass sowas nicht wieder passiert?

Naja, zur Not gibt's ja noch Thread.stop() ......
 
G

Guest

Gast
Thread.stop ist deprecated. Du solltest lieber Thread.interrupt benutzen
 

sparrow

Top Contributor
Halt Moment, wenn das die Client-Seite ist, dann blockiert der Thread ja niemals (so wie es ein ServerSocket.accept() machen würde).
In diesem Fall ist es dann problemlos möglich innerhalb der run-Methode an Schlüsselstellen zu prüfen ob das intterupt-flag gesetzt wurde und dann den Thread sauber zu beenden (in den meisten Fällen bedeutet das, dass die Endlosschleife verlassen wird).


Thread.stop() sollte man unbedingt vermeiden da man keinerlei Eingriffsmöglichkeit mehr hat was der Thread beim beenden tut bzw. an welcher Stelle der Thread unterbroche wird.
 

thre

Mitglied
Der blockiert auch auf Client-Seite. Der hängt nämlich in einem read(). Das Protokoll ist so aufgebaut, dass der Client praktisch ständig auf irgendwelche Nachrichten vom Server wartet. Deshalb brauche ich ja das select(). Vielleicht hab ich das nicht richtig beschrieben.

Mir ist ja auch klar, dass Thread.stop() der letzte Ausweg ist. Ich schließe den Socket und hoffe, dass der Thread mit einer Exception aussteigt. Währenddessen wartet der Haupt-Thread mit Thread.join(1000) auf das Ende des Threads. Sollte er dann immer noch laufen (was eigentlich nicht sein dürfte), ziehe ich mit Thread.stop() den Stecker. Ein Thread.interrupt() würde an der Stelle wohl auch nicht mehr helfen.


Thomas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Netzwerkverkehroptimierung [mySQL SELECT] Netzwerkprogrammierung 5
K NIO Selector.select() blockt nicht. Netzwerkprogrammierung 3
A Warum ist das Java "Select" so langsam? Netzwerkprogrammierung 13
T TCP mit und ohne Threads Netzwerkprogrammierung 1
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
Q-bert Link zugang ohne login sperren. Netzwerkprogrammierung 1
L Socket Zwei Computer im gleichen Netwerk ohne Portforwarding ? Netzwerkprogrammierung 12
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
D Zugriff auf Webinhalte ohne visuelles Öffnen der Website Netzwerkprogrammierung 2
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
N (TCP) Verbindung ohne Portforwarding Netzwerkprogrammierung 12
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
D Mit wsimport erstellte Klassen ohne WSDL nutzen Netzwerkprogrammierung 4
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
E RMI ohne Portforwarding? Netzwerkprogrammierung 2
M Ping mehrerer Ports aus int[] ohne for-Schleifendurchlauf Netzwerkprogrammierung 11
C Login ohne Erfolg Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
P RMI ohne Security Netzwerkprogrammierung 5
J Client ohne Server? Netzwerkprogrammierung 7
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
0 soap client ohne WSDL Netzwerkprogrammierung 3
J Connection Speed Test ohne Applet Netzwerkprogrammierung 5
E DatagramSocket rausfinden ob recive möglich ohne zu blocken Netzwerkprogrammierung 10
O Webservice ohne Eclipse laufen lassen Netzwerkprogrammierung 3
T Server ohne Port Netzwerkprogrammierung 4
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
C imap/java emails checken ohne runterzuladen? Netzwerkprogrammierung 3
T ohne Port Freigabe. Netzwerkprogrammierung 6
P P2P ohne Portfreigabe Netzwerkprogrammierung 12
J Client-Client-Chat ohne Serverbeteiligung Netzwerkprogrammierung 2
G Connection zu MySQL ohne ODBC Netzwerkprogrammierung 8
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
Paule Connection Applet Servlet ohne Socket bzw RMI Netzwerkprogrammierung 2
L http kommunikation mit und ohne multipart Netzwerkprogrammierung 4
R RMI: Remote Object ohne Naming Service benutzen? Netzwerkprogrammierung 2
K RMI ohne Kommandozeileneingabe Netzwerkprogrammierung 9
M Ende des Streams ohne Schließen/Checksumme mitsenden Netzwerkprogrammierung 2
G SSL Verbindung ohne Zertifikat Netzwerkprogrammierung 9
D Timeouts ohne Ende bei SMTP und FTP Netzwerkprogrammierung 3
M Client-Kommunikation ohne Server Netzwerkprogrammierung 7
M schreiben auf geschlossenen Socket ohne Exception Netzwerkprogrammierung 6
A server mit 2 Ports : Mit und ohne SSL Chat system Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben