Bonjour,
J'ai un problème au niveau de la gestion d'un thread.
Dans mon code, j'ai une classe (non thread elle-même) qui créé et lance un thread. Cette classe envoie des données que le thread doit copier dans un fichier.
Seulement, le thread n'arrive pas tout le temps à la fin de son traitement, il reste dans sa boucle infinie.
La boucle du thread est conditionnée par un booléan à vrai au lancement. Je le mets à faux quand il n'y a plus de données à envoyer.
Dans le cas où le thread se termine, il n'y a pas de problème, toutes les données sont copiées dans le fichier.
Dans l'autre, la chaîne que le thread doit copier n'est pas complète, elle est tronquée. Et je ne sais pas pourquoi.
Voici la classe principale, j'ai supprimé le superflu :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public class GenetiqueCube { // matrice binaire décrivant le cube private int[][][] matriceCube; // Thread pour sauvegarder le fichier private SaveFicThread myThread; public void affinage() { try { myThread = new SaveFicThread(); myThread.start(); } catch(IOException e) { e.printStackTrace(); } for(int i = 1; nbEssaiTmp > 0; i++) { try { String generation = Outils.matriceToString(); myThread.addGeneration(generation); } catch(Exception e) {} } try { myThread.setEcritureOK(false); } catch(Exception e) { e.printStackTrace(); } } }
Et voici mon thread :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public class SaveFicThread extends Thread { // flag pour continuer ou pas l'écriture private boolean ecritureOK; // fichier on on écrit private FileWriter writerMatrice; // queue private LinkedList<String> queue; public SaveFicThread() throws IOException { queue = new LinkedList<String>(); writerMatrice = new FileWriter(ficMatrice, false); ecritureOK = true; } // Ecriture des générations dans le fichier public void run() { boolean continuer = true; while(continuer) { try { synchronized(this) { String generation = getGeneration() + "\n"; writerMatrice.write(generation, 0, generation.length()); continuer = ecritureOK; } } catch(InterruptedException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } try { writerMatrice.close(); } catch(IOException e) { e.printStackTrace(); } } // Ajout d'une génération dans la queue public synchronized void addGeneration(String gen) { queue.addLast(gen); notify(); } // Retrait d'une génération public synchronized String getGeneration() throws InterruptedException { while(queue.isEmpty()) { wait(); } return queue.removeFirst(); } public synchronized void setEcritureOK(boolean b) { ecritureOK = b; } }
Merci beaucoup d'avance
Partager