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 >
