Bonjour à tous.

Je rencontre un problème dont je ne parviens à trouver la solution :

Je travaille sur un programme qui réalise un long traitement itératif sur une structure de données relativement volumineuse.
Le traitement dure un peu plus d'1 heure et consiste en environ 1000 itérations qui durent environ 4 sec chacune.

Je souhaite afficher des résultats intermédiaires toutes les 10 itérations.
L'affichage doit accéder à l'ensemble des données pour les afficher.

J'ai procédé ainsi :
  • Un thread de calcul séparé boucle sur les 1000 itérations (cela permet à l'utilisateur de stopper le traitement quand il le souhaite)

  • Toutes les 10 itérations, ce thread appelle mainPanel.repaint(); Cela demande au thread de swing de réafficher le panel principal, le thread de swing va donc, de façon concurente, vouloir accéder aux données. Pour éviter tout problème, le thread de calcul fait un sleep(1000); juste après l'appel à repaint() ce qui est largement suffisant pour réaliser l'affichage. Puis le calcul reprend et ainsi de suite.


Voici donc mon problème :
Les 10 premières itérations durent 4 secondes chacune, comme prévu.
Puis, dès qu'un premier affichage a été réalisé, toutes les itérations sont 2 fois plus lentes (8 sec.) et ce jusqu'à la fin du programme !!
Cependant, tout est exactement comme durant les 10 premières itérations : le thread de calcul est seul à travailler, sur les mêmes données.
Je n'y comprend rien.
Si je ne fais aucun affichage, les 1000 itérations ont la durée normale de 4 sec.

Ainsi dès qu'un autre thread (swing) veut accéder aux mêmes données, quand bien même ce n'est pas de façon concurrente, car j'ai fait en sorte que le thread principal soit stoppé pendant ce temps, alors tout est ralenti ...

J'ai une petite idée, mais ça me parait invraisemblable et je ne connait pas assez bien le fonctionnement interne de JAVA :
  • Ma structure de données contient plein de Vector et autres données thread safe.

  • Si Java voit qu'un seul thread accède à ces données, il n'active pas le "thread safe".

  • Dès que Java voit qu'un 2ème thread accède aux données, même de façon non concurrente, il active le "thread safe", ce qui ralentit tout, et cette activation perdure tout le reste du programme.

Cela est-il possible ?
comment peut-on corriger ce comportement étrange.

Auriez-vous des idées pour m'aider ?

Merci d'avance.

(j'utilise NetBeans 6.8 et JRE 1.6.0_04)