PDA

View Full Version : [Java] JTable e multithread


carosene
25-08-2007, 15:52
Ho creato un modello di una JTable estendendo AbstractTableModel. Nel modello è presente una LinkedList, che contiene gli elementi da visualizzare nella JTable.
Tale modello dispone dei metodi add() e remove() per aggiungere ed eliminare elementi dal modello.
Il problema si presenta nel momento in cui, ad aggiungere o ad eliminare un elemento della LinkedList, sia un thread differente dal thread che gestisce la gui. Infatti si verifica che in alcuni casi il thread della gui richiami getValueAt() di abstractTableModel, mentre un altro thread elimina un elemento dalla LinkedList, sollevando un'eccezione.
Come è possibile risolvere questo problema?

PGI-Bis
25-08-2007, 17:06
E' un suggerimento un po' alla pescatore ma prova a rimpiazzare la tua lista con ConcurrentLinkedQueue.

carosene
26-08-2007, 15:02
E' un suggerimento un po' alla pescatore ma prova a rimpiazzare la tua lista con ConcurrentLinkedQueue.

Ho provato con la classe ConcurrentLinkedQueue, ma sorge il seguente problema:

Tale collezione non consente di avere accesso ad un suo elemento attraverso un indice. Di conseguenza come faccio nel metodo getValueAt() a risalire all'elemento da visualizzare?

PGI-Bis
26-08-2007, 16:36
Eh eh eh, bella domanda.

Puoi provare con Vector o una lista "normale" passata per il metodo Collections.synchronizedList(laLista). Il problema è che questo tipo di strutture dati sono non gestiscono la modifica ai dati in concorso con l'iteratore. L'eccezione che ti ritrovi è probabilmente dovuta al fatto che mentre un thread scorre i dati con un interatore un altro thread o lo stesso thread eliminano un elemento dalla lista.

carosene
27-08-2007, 22:08
Eh eh eh, bella domanda.

Puoi provare con Vector o una lista "normale" passata per il metodo Collections.synchronizedList(laLista). Il problema è che questo tipo di strutture dati sono non gestiscono la modifica ai dati in concorso con l'iteratore. L'eccezione che ti ritrovi è probabilmente dovuta al fatto che mentre un thread scorre i dati con un interatore un altro thread o lo stesso thread eliminano un elemento dalla lista.

Grazie per la risposta.
Sto provando con ArrayList, sembra funzionare.