ListenerThread beenden



  • Hallo,

    ich habe einen ListenerThread, der nur die Aufgabe hat, auf einen TCP Inputstream zu horchen und die empfangenen Daten weiterzuleiten.
    Hier der Listenerthread abstrakt dargestellt:

    private class Listener
    extends Thread
    {
    	InputStream stream;
    
    	private int receive()
    	{
    		int result;
    		result = stream.read();
    
    		return result;
    	}
    
    	public void listenerInit(InputStream stream;)
    	{
    		this.stream = stream;
    		start();
    	}
    
    	public void listenerStop()
    	{
    		interrupt();
    	}
    
    	public void run()
    	{
    		while(receive())
    		{
    			if(Thread.interrupted())
    				return;
    		}
    	}
    }
    

    Mein Problem. Welche Möglichkeiten habe ich diesen Thread zu beenden, wenn er in der read-Methode blockend wartet?

    Vielen Dank und Grüße
    dziuba



  • Die schönste ist wahrscheinlich, eine Methode zum Abbrechen anzubieten, die den Stream einfach schließt und vorher ne Variable setzt. Wenn du dann ne Exception fängst und die Variable gesetzt ist, weißt du, dass es kein Fehler war sondern ein beabsichtigter Abbruch. Wiese leitest du eigentlich von Thread ab?



  • Vielen Dank. Der Tipp mit dem Schliessen der Streams hilft mir sehr. Wieso bin ich da nicht selbst drauf gekommen 😕

    Optimizer schrieb:

    Wiese leitest du eigentlich von Thread ab?

    Ist es unsauber von Thread abzuleiten? Ist das Benutzen der Schnittstelle Runnable sauberer oder schneller?



  • Ich find Runnable schon besser.
    Lohnt sich im Hinblick auf das neue Concurrency-Package mal anzusehen!



  • dziuba schrieb:

    Vielen Dank. Der Tipp mit dem Schliessen der Streams hilft mir sehr. Wieso bin ich da nicht selbst drauf gekommen 😕

    Optimizer schrieb:

    Wiese leitest du eigentlich von Thread ab?

    Ist es unsauber von Thread abzuleiten? Ist das Benutzen der Schnittstelle Runnable sauberer oder schneller?

    Es ist wohl nicht falsch, aber du erbst Funktionalität, die du wahrscheinlich nie verwendest. Die Idee zum Starten eines Threads ist die folgende:
    - Neuen Thread erstellen
    - Funktionszeiger setzen, wo der Thread starten soll
    - Thread starten
    (vgl. dazu Threads in boost, .Net)

    In Java gibt es keine Funktionszeiger. Stattdessen wird ein Objekt (welches Runnable implementiert) verwendet, welches praktisch über den virtuellen Methodenaufruf den Funktionszeiger zu run() zur Verfügung stellt. Das Runnable-Objekt ist also praktisch eine Art Provider für den Funktionszeiger.
    Das Thread-Objekt selber sollte nur den eigentlichen Thread repräsentieren und im Konstruktor diesen Provider bekommen.

    new Thread(myRunnable).start();
    

Anmelden zum Antworten