Samozrejme, je nutne ten casovac nejak ukoncit, treba zavolanim stop().
Musi preci vedet, ze ma skoncit - sam si to nevymysli.

Destruktor (finalizer, etc) by zde vubec nepomohl.
Je potreba mit na pameti, jak funguje casovac - nekde v pozadi je specialni 
vlakno, ktere drzi referenci
na ten casovac (a tedy na vsechny ty vase objekty). Dokud ji drzi, neprovede 
garbage collector uvolneni.

Samozrejme, v C++ si zivotni cyklus objektu ridite sam a tedy muzete v 
libovolnem okamziku rict, ze objekt znicite.
Nemusite se ohlizet na to, ze ho nekdo jiny (casovac, v tomto pripade) pouziva. 
Pokud ho bude pouzivat i nadale, tak mate pekny segmentation fault (nebo 
nejakou jinou veselou udalost).

Samozrejme pokud si date pozor, tak vsechno uvolnite v destruktoru, ale to je 
podle meho nazoru proste HACK. 
Pekne napsany kod v C++ vypada trochu jinak (coz je logicke, protoze priklad je 
z Javy).

Kazdoapdne: v Jave (a vsech jazycich pouzivajicich model "referenci") je objekt 
je znicen az v okamziku, kdy je to zcela bezpecne protoze ho nikdo nepouziva.

Kamil Podlesak

> -----Original Message-----
> From: [email protected] [mailto:[email protected]]on
> Behalf Of Dusan Zatkovsky
> Sent: Thursday, February 19, 2009 12:23 PM
> To: Java
> Subject: Nemam destruktor. Ako zastavim Timer()?
> 
> 
> 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