Ahoj.
Ospravedlnte prosim zaciatocnicky dotaz, ale zacinam byt na prasky. Ja, clovek
zvyknuty na jazyky, kde destruktor je samozrejmostou, sa potacam s tymto
problemom uz nejaku tu chvilu.
Mam hierarchiu tried, kde v poslednej class-e na spodku tejto hierarchie mam
Timer, ktory ma za ulohu periodicky volat metodu flush().
Uvediem rovno priklad, aby to bolo zrozumitelnejsie:
public class Main {
public static void main(String[] args) {
System.out.println("main starting");
MyClassMaster m = new MyClassMaster();
m.doSomething();
m = null;
System.out.println("main exiting");
}
}
public class MyClassMaster {
MyClassSlave slave;
public MyClassMaster() {
// v tomto momente sa vytvori v slave timer a spusti sa ...
slave = new MyClassSlave();
}
void doSomething() {
System.out.println("starting doSomething()");
System.out.println("exiting doSomething()");
}
}
public class MyClassSlave {
Timer t = new Timer();
// toto mi len wrapp-uje volanie sameho seba
class FlushTimerTask extends TimerTask {
MyClassSlave me;
public FlushTimerTask ( MyClassSlave _me ) {
this.me = _me;
}
public void run() {
this.me.flush();
}
}
// spustim timer
public MyClassSlave() {
t.schedule(new FlushTimerTask ( this ), 1000, 1000);
}
public void flush() {
System.out.println("MyClasSlave::flush()");
}
}
A tu je ( ocakavany ) vystup na stdout:
main starting
starting doSomething()
exiting doSomething()
main exiting
MyClasSlave::flush()
MyClasSlave::flush()
MyClasSlave::flush()
......
MyClasSlave::flush()
... a main samozrejme neskonci a apkilacia zostane vysiet.
V C++, alebo inom jazyku nepostradajucom destruktory, by som vyrobil nieco
ako:
void MyClassSlave::~MyClassSlave() {
this.timer.cancel();
}
... a bolo by po probleme. Ako ale pre boha vyriesim tento problem v Jave bez
toho, aby som z main() hierarchicky volal nejaku nahrazku destruktoru,
povedzme stop()?
Diky za nakop.
--
Dusan