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

Odpovedet emailem