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