Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Thread che legge un documento

    Qualcuno potrebbe, per favore, chiarirmi un paio di cose sui thread?

    Io ho questo problema: devo leggere un documento di per se un po' pesante, e vorrei evitare di far attendere l'utente mentre carica tutto il documento e lo visualizza, e dargli l'opportunità di continuare a lavorare mentre finisco di caricare

    (contate che sul documento di prova ci vogliono circa 5 minuti... e il documento di prova è "piccolo")

    Quindi ho pensato di fare un thread... e qui cominciano i pasticci, visto che con i Thread mi ci sono sempre taiato...

    Intanto vorrei che il thread, una volta finito il compito, fosse disponibile per un'altra chiamata... senza che devo ricreare il thread. Tipo un restart (se esistesse)

    poi, vorrei un modo per fargli interrompere il lavoro che stà facendo se l'utente va a fare altro (l'utente potrebbe premere un pulsantino che elimina il documento, subito dopo averlo selezionato. È ovvio che devo smettere subito di visualizzarlo e cancellare quello che ho visualizzato finora). Ma il metodo 'stop' è deprecated. In effetti, lascerei il file di lettura in uno stato inconsistente... e non va bene. Ma allora come faccio?

    Grazie in anticipo per l'aiuto

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

    Re: Thread che legge un documento

    Originariamente inviato da Reiuky
    Intanto vorrei che il thread, una volta finito il compito, fosse disponibile per un'altra chiamata... senza che devo ricreare il thread. Tipo un restart (se esistesse)
    No, una volta che il thread è entrato nello stato di "dead" (morto .... cioè quando è terminato il suo run()), non può più essere riavviato.

    Dipende se devi creare solo 1 thread per volta o se ce ne possono essere N concorrenti. Se ne devi creare 1 solo per volta e visto che, come hai detto, dura molto tempo, non vedo problemi di performance o occupazione di memoria nel creare ogni volta un nuovo thread.

    Originariamente inviato da Reiuky
    vorrei un modo per fargli interrompere il lavoro che stà facendo se l'utente va a fare altro (l'utente potrebbe premere un pulsantino che elimina il documento, subito dopo averlo selezionato. È ovvio che devo smettere subito di visualizzarlo e cancellare quello che ho visualizzato finora). Ma il metodo 'stop' è deprecated.
    Appunto, è deprecato. Ma qui spiega il perché e come poter gestire in modo diverso la terminazione o sospensione di un thread.

    Ne avevo già parlato in passato sul forum ... puoi provare a fare una ricerca (ora non ricordo dove e quando).
    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 Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Ok. Grazie Andbin.

    Mi sono letto un po' di cose, e mi sono studiato un po' meglio i thread...

    vista la situazione che mi trovo, ho deciso di optare per una soluzione del tipo (in pseudocodice)

    codice:
    Apri il file
    
    Finchè( continua o !finefile)
    {
        leggi e appendi la riga letta
    }
    
    chiudi il file
    
    end
    con "continua" che è una variabile booleana che mi setta la classe chiamante... Ecco... il problema è che le variabili sono passate per valore e non per riferimento... Dovrebbe esistere un modo per aggirare l'ostacolo... adesso me lo studio

    Intanto, questo pseudo codice, concettualmente, va bene?

  4. #4
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    ...

    Non basta a quanto pare. Ho sottovalutato una cosa:

    Onde evitare di generare errori, devo aspettare che il thread, una volta che gli ho settato la variabile continua a 'false', sia definitivamente morto prima di continuare....

    E questo non ho la più pallida idea di come farlo.

    Aiuto.....

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Reiuky
    con "continua" che è una variabile booleana che mi setta la classe chiamante... Ecco... il problema è che le variabili sono passate per valore e non per riferimento... Dovrebbe esistere un modo per aggirare l'ostacolo... adesso me lo studio
    No ... è sufficiente avere una variabile di istanza di tipo boolean marcata 'volatile' che sia accessibile da entrambi i thread (quello del "lavoro" e quello che vuole interrompere il lavoro).

    C'è solo una questione: se la tua lettura, per qualche motivo, è bloccata in una "read", in realtà anche se quella variabile la imposti per far finire il ciclo, ovviamente questo non avverrà fino a quando non si testa quella variabile.
    Se vuoi che il thread sia davvero cooperativo alla terminazione, anche se è in una read, allora dovresti usare interrupt(). Leggi meglio la pagina linkata.

    Originariamente inviato da Reiuky
    Intanto, questo pseudo codice, concettualmente, va bene?
    Direi di sì.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.