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

Wywoływanie metody run() klasy Thread z niej same
LI
  • Rejestracja: dni
  • Ostatnio: dni
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?

Kopiuj
 
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
        }
    }
    

XA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

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

Olamagato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Polska, Warszawa
  • Postów: 1066
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ę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.