Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20

    Scrittura di un file da pù thread

    Salve ragazzi/e,
    allora ho questa classe

    public class PrintMessage {
    static void PrintOnLogFile (String strMsg)
    {
    FileWriter fileWriter = new FileWriter("out.txt", true);
    BufferedWriter filebuf = new BufferedWriter(fileWriter);

    PrintWriter printWr = new PrintWriter (filebuf, true);

    //accesso a un file out.txt per appendere la riga strMsg
    }
    }

    Il metodo statico PrintOnLogFile può essere richiamato da più thread (quindi contemporaneamente). Ovviamente devo sincronizzare l'accesso al file?

    Basta cambiare in questo modo:
    public synchronized static void PrintOnLogFile {
    //......
    }

    Si può far così? oppure potete consigliarmi un metodo un po' più ottimizzato (per far attendere il meno possibile un altro thread che vuole scrivere lo stesso file)

    Grazie mille

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

    Re: Scrittura di un file da pù thread

    Originariamente inviato da Promo
    Ovviamente devo sincronizzare l'accesso al file?
    Sì certo, però in generale bisogna vedere se devi sincronizzare l'accesso al file da più thread nella stessa applicazione o l'accesso al file da più applicazioni.

    Originariamente inviato da Promo
    Basta cambiare in questo modo:
    public synchronized static void PrintOnLogFile {
    //......
    }

    Si può far così?
    Sì, questo è il minimo indispensabile per evitare che più thread accedano contemporaneamente al file.

    Originariamente inviato da Promo
    oppure potete consigliarmi un metodo un po' più ottimizzato (per far attendere il meno possibile un altro thread che vuole scrivere lo stesso file)
    Un thread a parte che si occupa solo della scrittura dei dati e che aspetta i dati da una "coda". Ogni thread semplicemente aggiunge il dato nella coda (quindi molto veloce). Ovviamente andrebbe fatto "incapsulando" bene questa gestione, ovvero i thread non dovrebbero "sapere" nulla della coda o altro. Magari dovrebbero solo fare una cosa del tipo, es.: myLog.enqueue(messaggio);


    P.S. Non è meglio se usi un apposito framework di logging, es. Log4J o anche solo il supporto al logging fornito da Java 1.4 e oltre?
    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
    Registrato dal
    Sep 2009
    Messaggi
    20
    Grazie mille per le varie alternative!
    Ti vorrei fare alcune domande, anche per accrescere le mie conoscenze

    Un thread a parte che si occupa solo della scrittura dei dati e che aspetta i dati da una "coda". Ogni thread semplicemente aggiunge il dato nella coda (quindi molto veloce). Ovviamente andrebbe fatto "incapsulando" bene questa gestione, ovvero i thread non dovrebbero "sapere" nulla della coda o altro. Magari dovrebbero solo fare una cosa del tipo, es.: myLog.enqueue(messaggio);
    Può essere un'interessante alternativa! Soprattutto quando i thread scrivono molto su file! Mi puoi indicare che classi conosci per realizzare questa tecnica (bo, esistono code sincronizzate o dovrei implementare tutti i lock?), così do uno sguardo!

    o anche solo il supporto al logging fornito da Java 1.4
    Ho cominciato a vedere il logging di java ed ho fatto il mio programma di test

    codice:
    public class PrintMessage {  	
      private static Logger logger = Logger.getLogger("PrintMessage");  	
      private static Handler fh = null;    	
      static void PrintOnLogFile (String strMsgToWrite){  		
        //accesso al logger  	
      }  
    }

    Ovviamente anche qui dovrei mettere
    "public synchronized static void PrintOnLogFile"
    oppure la classe Logger è già sincronizzata?


    Un ultima domanda: il System.Out.Println("...") può essere chiamata da più thread contemporaneamente senza necessità di sincronizzazioni giusto?

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Promo
    Può essere un'interessante alternativa! Soprattutto quando i thread scrivono molto su file! Mi puoi indicare che classi conosci per realizzare questa tecnica (bo, esistono code sincronizzate o dovrei implementare tutti i lock?), così do uno sguardo!
    Le code che sono già thread-safe sono tutte quelle che implementano la interfaccia java.util.concurrent.BlockingQueue. Ma è tutta "roba" nuova (e sofisticata) di Java 5. Altrimenti basterebbe anche solo un semplice LinkedList (che di per sé non è thread-safe) però devi o occuparti tu della sincronizzazione (la "incapsuli" nella tua gestione del logging) oppure ne ottieni una versione "synchronized" usando Collections.synchronizedList().
    Insomma.. l'importante è che ci sia una "sincronizzazione" tra chi scrive il messaggio e il thread che legge dalla "coda". Poi come fare tutto questo ... beh, ci sono svariati modi.

    Originariamente inviato da Promo
    Ovviamente anche qui dovrei mettere
    "public synchronized static void PrintOnLogFile"
    oppure la classe Logger è già sincronizzata?
    Se guardi la documentazione di java.util.logging.Logger ad un certo punto leggerai:

    All methods on Logger are multi-thread safe.

    Originariamente inviato da Promo
    Un ultima domanda: il System.Out.Println("...") può essere chiamata da più thread contemporaneamente senza necessità di sincronizzazioni giusto?
    Is System.out.println(String) Thread safe?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2026 vBulletin Solutions, Inc. All rights reserved.