Wywoływanie metody run() klasy Thread z niej same

0

Witam

Zastanawiam się czy jest to poprawne rozwiązanie i czy są może inne.
W wątku mam nasłuchiwanie podłączających się aplikacji klienckich do socketu serwera. W zasadzie chodzi o to zeby zlapac tylko jednego (pierwszego). W przypadku kiedy na tym porcie otwarty jest już inny socket serwera występuje wyjątek, w którym zmieniam port. oraz wywołuję jeszcze raz metodę run(). Czy takie rozwiązanie jest poprawne, oraz czy wywołana przeze mnie w ten sposób metoda (nie przez: watek.start()) zadziała poprawnie jako wątek, a nie jako zwykła funkcja?

 
class myThread extends Thread{

        ...
	public void run() {
        try {
            this.socketServer = new ServerSocket(this.port);
            
            while (listening) {

                Socket socket = this.socketServer.accept();
                ...             
                
                listening = false;
            	}            	
            }
        }
        catch (Exception e) {
            
            	listening = true;
            	this.port +=2;
            	run();   //<---- sedno sprawy
        }
    }
    

0

Jak wywołujesz run() to wywołujesz jak zwykłą funkcję, nie ma żadnej "magii". Jest po prostu wywoływana.
Może dojść do nieskończonej rekurencji -> stack overflow.
Daj try do pętli.

0

@libed to zadziała i będzie pracować cały czas w tym samym wątku, ale będziesz powiększać stos...

0

Usuń rekurencję przez wrzucenie instrukcji try w pętlę do-while z warunkiem ustawionym na zmienną boolean, którą wstępnie ustawiasz na false. Jeżeli wejdzie w blok catch, to tam po prostu ustawisz ją na true (zamiast wywoływać od nowa run()). Wtedy cała pętla, to znaczy całe try, powtórzy się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1