Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312

    concorrenza in java

    Salve a tutti,
    sto studiando la concorrenza in java, precisamente i readwritelock e le istruzioni shincronyzer. Entrambe (con delle differenze) regolano l'accesso ad una porzione di codice.
    Io devo rendere esclusivo l'accesso ad ogni singola cella di un array ma nessuna delle due classi mi aiuta. Come posso fare? L'intenzione è creare un'array di semafori per poi nel thread scrivere una cosa del genere semaforo[i].wait eppoi signal... La classe readwritelock permette solo di prendere e rilasciare un lock ma non mi sembra ci sia un modo per relazionarlo alla cella di un array.

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

    Re: concorrenza in java

    Originariamente inviato da lio.b
    Io devo rendere esclusivo l'accesso ad ogni singola cella di un array
    Motivo? Spiega bene il perché e quale è lo scenario in modo più chiaro.
    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 2008
    Messaggi
    312
    Allora,
    ho un array (memoria condivisa) in cui un thread scrittore va a scrivere dei file immagine e un thread lettore le mostra su di una gui. Devo gestire una sorta di preload, cioè mentre visualizzo la prima immagine scarico e scrivo sull'array delle altre. Se uso shincronyzer mi ritrovo che mentre leggo l'immagine nella cella 0 (per esempio) non posso scrivere le nuove immagini nella cella 1 e 2 dell'array

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    ho un array (memoria condivisa) in cui un thread scrittore va a scrivere dei file immagine e un thread lettore le mostra su di una gui.
    Hai già l'altra discussione aperta ...

    Originariamente inviato da lio.b
    Se uso shincronyzer mi ritrovo che mentre leggo l'immagine nella cella 0 (per esempio) non posso scrivere le nuove immagini nella cella 1 e 2 dell'array
    Ma quello che forse non hai ancora afferrato è che il get()/set() su un List ma anche un add() se ipotizziamo un numero non enorme di elementi, sono operazioni brevissime!!!

    Quindi usando un Vector (o ArrayList in un synchronized "wrapper") se anche un thread sta leggendo la cella X (quindi ha il lock) è una operazione brevissima e se un altro thread sta cercando di leggere un'altra cella o di aggiungere un elemento ... beh, aspetterà un tempo molto molto molto piccolo.

    E come ti ho già detto nell'altra discussione, non servirebbe un thread che "legge", basterebbe usare un Timer.
    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
    Registrato dal
    Sep 2008
    Messaggi
    312
    Il thread che va a leggere in effetti fa solo una get(). Per poi inserire l'immagine in un ImageIcon, ma la scrittura deve copiare tutto il file byte per byte ed è onerosa. Il conclusione suggerisci un shincronyzer? Nell'usare due thread sono obbligato. Lettore/scrittore.
    Quello che mi chiedo è questo:
    1. conviene shincronyzer o readwritelock
    2. quale politica usare per risvegliare i thread in attesa?

    Ti ringrazio enormemente

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Scusami,
    un ultima cosa, non conosco la classe timer di swing. Quando vedo a prelevare l'immagine non può capitare che l'altro thread stia scrivendo? O pensa a tutto vector in quanto è sincronizzato?
    Se potessi farmi un brevissimo esempio in codice dell'uso di timer riguardo il mio contesto te ne sarei grado

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Per poi inserire l'immagine in un ImageIcon, ma la scrittura deve copiare tutto il file byte per byte ed è onerosa.
    Ma che stai dicendo?!!! ImageIcon è un oggetto che al suo interno ha un Image che a sua volta avrà i riferimenti ai dati della immagine .... ma tutto questo non ti interessa. Nella lista viene solo inserito un "reference". Punto.

    Originariamente inviato da lio.b
    Il conclusione suggerisci un shincronyzer? Nell'usare due thread sono obbligato.
    L'ho già detto prima: Vector o un ArrayList wrappato come synchronized. E non ti serve il thread di lettura ... basta un Timer. Ogni quanto tempo devi cambiare immagine a video? 2 secondi? 5 secondi? 20 secondi? Di più? Metti un timer e basta. Il "consumo" delle immagini è certamente più lento della "produzione"!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Quando vedo a prelevare l'immagine non può capitare che l'altro thread stia scrivendo?
    Certo ma come ho detto operazioni come get/set e add (se la lista non è lunghissima) sono brevissime e se la collezione è synchronized vuol solo dire che solo 1 thread per volta può accederci. Ma essendo operazioni brevi, non ci sono problemi, specialmente per le tempistiche che devi tenere nella visualizzazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Ok, l'unica cosa su cui non concordo è l'uso di un vector riparatore.
    Perchè se devi aggiungere un'immagine enorme può capitare che il thread scrittore, a metà esecuzione viene schedulato e quindi il lettore troverà un'immagine incompleta. Ecco perchè usare i lock, correggimi se sbaglio

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Ok, l'unica cosa su cui non concordo è l'uso di un vector riparatore.
    Perchè se devi aggiungere un'immagine enorme può capitare che il thread scrittore, a metà esecuzione viene schedulato e quindi il lettore troverà un'immagine incompleta. Ecco perchè usare i lock, correggimi se sbaglio
    No alt. Allora seguimi bene.

    Innanzitutto sono andato a controllare, giusto per sicurezza. ImageIcon usa il Toolkit di AWT per caricare la immagine (e questo lo sapevo) ma poi ImageIcon ne fa il "tracking" per attendere che la immagine sia completa. Quindi quando fai new ImageIcon(....) il costruttore impiega tutto il tempo che serve per caricare in modo completo la immagine. E quando ritorna, l'oggetto ImageIcon che ottieni è "completo" come immagine.

    Come ti ho già detto, nella lista vengono aggiunti solo dei "reference" agli oggetti, quindi non centra cosa/quanto contiene l'oggetto.
    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.