|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 230
|
[java] e metodo finalize()
Si puo fare l'ovveride del metodo finalize() di Object?Mi serve eseguire una certa cosa quando il programma viene killato,ho provato ma non sembra andare
![]() ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Non ho mai provato a farlo, ma si dovrebbe riuscire (naturalmente richiamando un bel super.finalize(); )... considera che il metodo non viene richiamato in maniera deterministica ma solo quando inizia a frullare il gc...
A questo punto ho qualche dubbio sul fatto che il gc venga richiamato nel momento in cui viene terminato il programma (d'altra parte viene rilasciata tutta la memoria assegnata a quel processo).... quindi prova a richiamarlo tu (mi pare con Runtime.gc(); oppure con RunTime.runFinalization() ![]() Facci sapere che sono curioso... ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Ah... mi sembra ovvio ma è meglio specificare che...
naturalmente perché il gc possa fare il suo lavoro non ci devono essere più riferimenti all'oggetto in questione |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 230
|
Ho provato ma il metodo finalize() che ho ridefinito non viene richiamato per una uscita anomala dal programma ma soltanto se si termina con una System.exit,a me invece serve che il metodo in questione venga eseguito quando il programma viene killato.
![]() ![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Non penso ci sia il modo di intercettare questo evento proveniente dall'OS...
Devi cercare una strada alternativa... Magari se spieghi meglio il problema e le risorse che devi deallocare si riesce a capire meglio l'eventuale soluzione... Considera inoltre che penso che neppure in Linux sia possibile intercettare il kill -9... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 230
|
Il programma ha un thread principale che contiene tutto il corpo del programma,resta in background (non ha interfaccia) ed emette dei messaggi tramite dialogbox in corrispondenza di determinati eventi.
All'attivazione genera un file che mi serve x controllare che altre istanze non vengano eseguite,il file dovrebbe poi essere cancellato all'uscita.Il problema è che il prog non ha una funzione di uscita quindi verrebbe killato dall'arresto di windows,avevo quindi pensato di cancellare il file nel metodo finalize() ![]() ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Il file ti serve per creare una sola istanza del thread a livello di programmazione (cioé possibilità di istanziare un solo oggetto Thread) oppure ti serve per evitare che un utente lanci due volte il programma?
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 230
|
Mi serve per evitare che l'utente lanci n volte il programma xchè se lo facesse esisterebbero n istanze del programma e quindi in concomitanza all'evento n dialogbox.
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Allora prova a vedere le classi FileLock e FileChannel del package java.nio.*
Sono presenti solo dalla versione 1.4.x del jdk ma penso che dovrebbero fare al caso tuo... ... se trovi la soluzione naturalmente posta... |
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Re: java e metodo finalize()
Nel corso della discussione ho un po' perso il filo del discorso per cui prima di intromettermi avrei bisogno di una conferma:
in pratica tu vorresti eseguire del codice nel momento in cui la JVM viene chiusa e uno shutdownhook non ti basta perchè non gestisce il "killing" dell'applicazione da parte del sistema operativo? Se la risposta è "NO" allora non ho capito niente, se è "SI" allora possiamo farci qualcosa. Fammi sapere e in caso vediamo che si può fare. Ciao. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Cosa intendi per shutdownhook???
![]() Mi piacerebbe esplorare questa cosa... intendi interagire con gli hook del sistema operativo tramite jni? |
![]() |
![]() |
![]() |
#12 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
E' un "pezzo" di java che si usa sopratutto con i database, per evitare di lasciare aperte connessioni nel caso in cui il programma venga terminato brutalmente (ad esempio via TaskManger).
L'esempio più semplice è il metodo [File].deleteOnExit(). Quando la jvm viene chiusa il file viene cancellato. Quello che fa quel metodo è un'implementazione di "addShutDownHook(Thread t)" della classe Runtime. Codice:
... Runtime.getRuntime().addShutDownHook(shutDown); ... class ShutDown extends Thread { public void run() { //... //operazioni "dell'ultimo minuto" //... } } Per gestire "uscite brutali" si usa allora un gestore di segnali ma la faccenda diventa un po' più laboriosa perchè fa parte di un pacchetto (sun.misc) presente nel JDK ma non documentato. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2000
Città: Montreal (Canada)
Messaggi: 1309
|
Interessante.... e buono a sapersi...
![]() |
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Interessante sì, ma poco "Java-style" perchè è platform-dependent e, come tutti i package sun.qualcosa, non è garantita la futura implementazione
![]() Pippos non dà segni di vita (scherzo), lo prendo per un "SI" e posto un po' di codice (domani non sono on-line e magari deve trovare una soluzione in fretta) Codice:
import sun.misc.*; import java.io.*; public class Prova { private ShutdownHandler shutDown=new ShutdownHandler(); private ShutDownHook hook=new ShutDownHook(); private boolean nostop=true; private File tempFile=null; Prova() { Signal.handle(new Signal("INT"),shutDown); //CTRL-C Signal.handle(new Signal("TERM"),shutDown); //CHIUSURA DEL SISTEMA //Signal.handle(new Signal("KILL"),shutDown); //fino al JDK v. 1.3 SHUTDOWN DA TASK MANAGER Runtime.getRuntime().addShutdownHook(hook); tempFile=new File("f:\\cancellami.txt"); try { tempFile.createNewFile(); } catch (IOException ex) { System.out.println(ex); System.exit(0); } //un ciclo infinito per verificare che funzioni //l'intercettazione dei segnali del sistema operativo while(nostop) {/*...*/} } public static void main(String[] args) { new Prova(); } class ShutdownHandler implements SignalHandler { public void handle(Signal signal) { System.exit(0); //questo richiama l'hook } } class ShutDownHook extends Thread { public void run() { System.out.println("Cancello il file temporaneo"); if(tempFile.exists()) { tempFile.delete(); } System.out.println("il programma verrà chiuso tra 2 secondi"); try { Thread.currentThread().sleep(2000); } catch (Exception e) { System.out.println(e); } } } } ![]() La chiusura effettiva della JVM è poi gestita dal Thread ShutDownHook che cancella il file "temporaneo". Il pessimo ciclo infinito while e il suo indegno booleano "nostop" servono solo per simulare un'applicazione che gira costantemente. Per una versione UNIX del programma i segnali dovrebbero essere "INT" "TERM" "QUIT" e (forse) anche "KILL" Fammi sapere se è servito a qualcosa Ciao. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 230
|
Grazissime PGI la tua soluzione funziona bene e fà proprio a caso mio
![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
Quote:
Multiple markers at this line - Access restriction: The constructor Signal(String) is not accessible due to restriction on required library /usr/lib/jvm/ java-6-sun-1.6.0.20/jre/lib/rt.jar - Access restriction: The type Signal is not accessible due to restriction on required library /usr/lib/jvm/java-6- sun-1.6.0.20/jre/lib/rt.jar - Access restriction: The method handle(Signal, SignalHandler) from the type Signal is not accessible due to restriction on required library /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/rt.jar - Access restriction: The type Signal is not accessible due to restriction on required library /usr/lib/jvm/java-6- sun-1.6.0.20/jre/lib/rt.jar Cosa significa??? Quelle librerie sono forse state deprecate??? Esistono delle alternative?? Grazie mille!!!
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]() Sviluppi con Eclipse? Guarda qui
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:11.