Nemam destruktor. Ako zastavim Timer()?
Podlesak Kamil
Kamil.Podlesak na ips-ag.net
Čtvrtek Únor 19 12:53:04 CET 2009
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: konference-bounces na java.cz [mailto:konference-bounces na java.cz]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
>
Další informace o konferenci Konference