jak pozbyc sie referencji do obiektu (watki)

0

hej,

mam maly problem - otoz nie wiem jak pozbyc sie referencji do zyjacego obiektu, w innym obiekcie. Ale po kolei:
Mamy klase Main ktora uruchamia 2 watki: A i B. B jest zarazem singletonem. A posiada do niego referencje
i w jakis okreslonych sytuacjach sie do niego odwoluje. Kod watku A mozna mniej wiecej przedstawic tak:

 
 public class A extends Thread{
    
	private B b = B.getInstance();
	private boolean go = true;
	
	
	public void run(){
	
	   try{
	   
	      while(go){
		     //rob jakas logike
		  }   
	   } catch(jakis Exception e){
	      //w przypadku bledu odwolaj sie do b
	   }	   
	   finally{
	       //posprzataj i ustaw go na false
		   go = false;
	   }	
	}
 }

No dobra, jak wystapi jakis blad, przejdziemy do finally, go ustawi sie na false wiec while nie bedzie sie
juz wykonywal-watek powinien sie zakonczyc. Ale.. b tez jest watkiem, ktory nadal sobie dziala. Zas "a"
posiada do niego referencje - wiec chyba sie jednak ten watek nie zakonczy. Tzn ten obiekt bedzie nadal
zyl, a nie powinien.
Moje pytanie jest takie - jak moge pozbyc sie w miejscu finally referencji do "b"? Przyszlo mi do glowy
cos takiego:

 
  public class A extends Thread{
    
	private boolean go = true;
	private B myB;
	
	public A(B b){
	  myB = b;
	}
		
	public void run(){
	
	   try{
	   
	      while(go){
		     //rob jakas logike
		  }   
	   } catch(jakis Exception e){
	      //w przypadku bledu odwolaj sie do b
	   }	   
	   finally{
	       //posprzataj i ustaw go na false. "myB" na null
		   go = false;
		   myB = null;
	   }	
	}
 }

czyli przekazuje "b" w konstruktorze, i przypisuje go do lokalnego myB. Ktore potem w finally ustawiam
na null. "b" nadal sobie zyje, ale poza "a. Nie podoba mi sie jednak ten sposob i mysle ze moze (?)
niesc za soba jakies zagrozenia. Co o tym myslicie? Czy ktos z Was ma moze dla mnie jakas rade?

   pozdrawiam,
          misty
0

Po co chcesz usuwać referencję? Wątek się zakończy, i jeśli nie będzie do niego żadnych referencji, kiedyś tam zostanie sprzątniety. b w żadnym wypadku nie zawiera się w a, nawet, jeśli tworzone jest wewnątrz a. To tylko referencja - i nie ma żadnej potrzeby nullowania jej.

0

Wątek się zakończy, i jeśli nie będzie do niego żadnych referencji, kiedyś tam zostanie sprzątniety..

Watek sie zakonczy, ale obiekt bedzie istnial jesli bedzie mial referencje do czegos co jeszcze zyje (tutaj do watku "b"). no tak mi sie wydaje przynajmniej. Wyobraz sobie taka sytuacje ze mam odpalony watek "a"-cos sie stanie, go=false, watek konczy swoje dzialanie (ale obiekt nie konczy zycia bo ma ref do "b" ktory sobie dziala). Watek "b" tak na prawde robi to, ze restartuje "a" - tzn wie ze tamto stare "a" padlo, wiec po paru sek tworzy nowe "a". Wyobrazmy sobie ze to nowe "a" po jakims czasie znow zlapalo jakis exception, go na false, "b" otwiera nowe "a" po paru sek. I tak powiedzmy N-razy. Zobacz ile bede miala starych obiektow "a"!
Chce tego uniknac, wydaje mi sie ze moze to byc niebezpieczne. Co o tym sadzisz?

0

Watek A sie zakonczy, i jak nie bedzie zadnych ref do niego, to zostanie sprzatniety. Nie inaczej. GC dziala tak ze sprzata co moze, i nie sprzata tego do czego sa referencje. Nie sprawdza czy obiekt do ktorego nie ma referencji (watek A) ma referencje do czegos innego - po co, kogo to obchodzi?
Watek B bedzie sobie dalej latal, nawet jak nie ma do niego referencji - az sie skonczy. To normalne. Jesli w nim zaimplementujesz restart watku A, to sama jestes sobie winna, jesli wiesz ze to niebezpieczne z jakiegos powodu to tak nie rob.
Wydaje mi sie ze bardzo mieszasz watki z GC.

0

dzieki, juz kumam.

pzdr

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