Fammi capire, hai fatto tutta una serie di elucubrazioni così complicate, parlando di ReadWriteLock, wait, signal ecc... quando poi devi fare una cosa così semplice, banale e lineare???Originariamente inviato da lio.b
Ho 2 thread, uno scrive un file immagine nell'array list e l'altro legge (in maniera temporizzata) per mostrare il file(immagine) in una JLabel.
Non posso sapere quanti file ho ma all'incirca non credo siano più di 30...
Hai un thread "produttore", che carica delle immagini, una per volta in sequenza, suppongo. E questo è ok. Dici che hai un thread di lettura che mostra immagini in modo "temporizzato". Già questo non servirebbe.
Quello che ti serve è un banale Vector o in alternativa un ArrayList "wrappato" come synchronized list (con synchronizedList() di Collections). Il thread che produce immagini usa questa collezione synchronized solo per fare add() per aggiungere una immagine.
Non ti serve un "thread di lettura". Usa javax.swing.Timer. Nell'evento del timer sei già nel contesto del EDT, puoi quindi accedere tranquillamente a qualunque componente della interfaccia (JLabel o quello che userai per visualizzare la immagine).
Ad ogni evento del timer semplicemente cerchi di andare avanti come indice nella lista, eventualmente tornando all'inizio (se vuoi il "loop" delle immagini) se sei alla fine.
È inutile fare discorsi su ReadWriteLock o qualunque altra "sofisticheria" se poi le tempistiche di scrittura nella lista e sopratutto di lettura dalla lista sono così alte che non frega niente a nessuno se viene usata una piccolissima frazione infinitesima di tempo per acquisire un lock giusto per aggiungere o leggere un oggetto ogni tanto!!!