Il y a bien plusieurs threads qui accedent à dtmModel.Envoyé par Bloodscalp
Le thread de recherche que tu lances juste au dessus et juste après il y a le main thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part TableSorter tbsSorter = new TableSorter(dtmModel);
J'ai réussi à reproduire l'erreur (Si je ne l'avais pas, c'est parce que ma machine va trop vite apparemment)
J'ai mis un Thread.sleep(1) dans le for du dessus, histoire que la recherche prenne plus de temps.
Donc voila l'impression que j'ai (qui n'est qu'une impression)
Le thread de recherche modifie dtmModel pendant que le main thread y accede (par le biais de la classe TableSorter et de ses différentes méthodes qui récupèrent le nombre de lignes, les valeurs etc)
J'ai résolu chez moi en synchronisant les endroit ou le truc était accédé.
Autrement dit dans la classe Main :
Et dans TableSorter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // Créer un nouveau threas ou s'éxecuteras la recherche Thread RechercherUtilisateurs = new Thread() { @Override public void run() { for(int i = 0; i<2000; i++){ synchronized (dtmModel) { dtmModel.addRow(new String[] {i+"", "texte", "texte", "texte"}); } } } };
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public Object getValueAt(int row, int column) { synchronized (tableModel){ return tableModel.getValueAt(modelIndex(row), column); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 private Row[] getViewToModel() { synchronized (tableModel){ if (viewToModel == null) { int tableModelRowCount = tableModel.getRowCount(); viewToModel = new Row[tableModelRowCount]; for (int row = 0; row < tableModelRowCount; row++) { viewToModel[row] = new Row(row); } if (isSorting()) { Arrays.sort(viewToModel); } } } return viewToModel; }
Y a d'autres endroits dans TableSorter ou c'est accédé, mais apparemment pas dans cet exemple alors je n'ai rien touché d'autre.
En résumé bien faire attention aux endroit ou un objet peut-être accédé dés qu'on lance un thread.
Si je n'avais pas l'exception chez moi c'est que la recherche se finissait avant l'utilisation de TableSorter.
Une autre solution serait de laisser la recherche se terminer avant de faire la suite (et donc de ne pas faire un autre thread) si elle ne prend pas trop de temps.
Voila, j'espère que cette fois est la bonne.
Partager