Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774

    programma temporizzato

    salve a tutti...
    devo scrivere un programma che verifica la presenza di un file e che, se non lo trova subito, continua a verificarne la presenza per un dato tempo (il timeout è definito dall'utente).

    per la ricerca del file nessun problema...
    però prima di iniziare mi domandavo come fare per temporizzare il ciclo....

    devo per forza lanciare un nuovo thread che esegue il ciclo fino a che non trova il file e stoppare il suddetto thread dopo che è scaduto il tempo?
    o posso fare tutto con un thread unico?

    come si calcola la durata di esecuzione di un thread?


    grazie mille
    citrus

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: programma temporizzato

    Originariamente inviato da citrus
    devo scrivere un programma che verifica la presenza di un file e che, se non lo trova subito, continua a verificarne la presenza per un dato tempo (il timeout è definito dall'utente).
    Ecco una possibile soluzione:
    codice:
    import java.io.File;
    
    public class WaitForFile
    {
        private File f;
    
        public WaitForFile (File f)
        {
            this.f = f;
        }
    
        public boolean waitUntilExists (long timeout)
            throws InterruptedException
        {
            final Object monitor = new Object ();
    
            synchronized (monitor)
            {
                Runnable r = new Runnable ()
                {
                    public void run ()
                    {
                        try
                        {
                            while (true)
                            {
                                if (f.exists ())
                                    break;
    
                                Thread.sleep (50);
                            }
                        }
                        catch (InterruptedException e) { }
    
                        synchronized (monitor)
                        {
                            monitor.notify ();
                        }
                    }
                };
    
                Thread t = new Thread (r);
                t.start ();
    
                try {
                    monitor.wait (timeout);
                } finally {
                    t.interrupt ();
                }
            }
    
            return f.exists ();
        }
    }
    Da usare così:
    codice:
    WaitForFile wff = new WaitForFile (new File ("nomefile"));
    
    try
    {
        boolean exists = wff.waitUntilExists (8000);  // 8 secondi di timeout
    
        System.out.println (exists ? "esiste" : "non esiste");
    }
    catch (Exception e)
    {
        System.out.println (e);
    }
    Non ho certo la pretesa di dire che è perfetto ... anzi, io stesso non sono sicuro al 100% della correttezza di quello che ho scritto. Se qualcuno più esperto sa dirmi se è valido o meno, ringrazio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    wow fantastico!
    non mi aspettavo tanto!
    così mi togli tutto il divertimento (naturalmente scherzo)
    cmq funziona alla grande!!

    vorrei capire però una cosa:
    il synchornized lo usi per fare in modo che solo un thread per volta possa accedere all'oggetto monitor, giusto?

    nel nostro caso però si può anche fare a meno vero?
    tanto il thread è sempre e solo 1...
    è giusto per capire perchè non scrivo programmi multithread dall'ultimo progetto in università e sono un po' arrugginito

    cmq grazie mille sei stato fantastico

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da citrus
    wow fantastico!
    non mi aspettavo tanto!
    così mi togli tutto il divertimento (naturalmente scherzo)
    Spero che il tuo non sia un "compito a casa" ... altrimenti il voto me lo devo prendere io.

    Originariamente inviato da citrus
    vorrei capire però una cosa:
    il synchornized lo usi per fare in modo che solo un thread per volta possa accedere all'oggetto monitor, giusto?

    nel nostro caso però si può anche fare a meno vero?
    tanto il thread è sempre e solo 1...
    No, non è proprio così.
    Il metodo waitUntilExists() non è synchronized, quindi più thread potrebbero effettivamente chiamare questo metodo (su una stessa istanza di WaitForFile) per aspettare il file.
    L'unico svantaggio è che verrebbero creati N thread di polling ... ma quello è il meno. Si potrebbe anche studiare una soluzione un po' più completa/complessa in cui c'è sempre solo 1 thread di polling.

    Comunque, a parte questo, all'interno del metodo creo un Object che mi serve per la sincronizzazione tra il thread corrente e il thread di polling (e non c'entra nulla con il fatto che più thread possono chiamare waitUntilExists() ). Il synchronized su 'monitor' serve perché per fare la wait o la notify su un oggetto, bisogna "possederne" il suo monitor (e non a caso ho chiamato la variabile 'monitor').
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    perfetto, ho capito grazie mille
    non preocuparti non era un compito ma solo un utility per me e cmq non copio mai il codice pari pari... infatti ho l'ho riscritto seguendo le tue dritte ma non uguale...
    altrimenti non facevo il programmatore ma il capo/sfruttatore

    cmq sei stato davvero prezioso ti ringrazio di nuovo moltissimo.
    spero di poterti rendere il favore prima o poi.
    a presto
    citrus

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.