bonjour,

En java, J'essaye d'utiliser une FIFO (queue) dont chaque "element" est un tableau d'int. Cette fifo devant etre écrite / lue par deux threads differents, je me suis tourné vers une ConcurrentLinkedQueue . Tout va bien tant que je déclare des elements simples type "Integer" ou "String", mais je ne comprends plus le fonctionnement quand je veux déclarer des tableaux de int ( int[] ) pour chaque element. La FIFO me renvoit "comme le dernier élément, je dois me gaufrer dans la récupération (poll), comme si le "pointeur" du tableau de la fifo lue n'etait pas bien interpreté..

je vous met un exemple de code simple que j'ai dérivé d'un example :

il consiste juste à déclarer un tableau de int, dont je vais modifier le 2ème element à chaque écrite dans la queue fifo. J'écris la fifo rapidement et je la lis lentement. on voit que le nombre d'elements est correct (le poll vide bien la fifo) mais le contenu rapatrié par poll semble erroné (le 2eme element du tableau rappatrié par poll ne contient pas le bon numero, il contient systematiquement le dernier element écrit et plusieurs fois de suite (ce n'est pas non plus une pile!):

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
 
import java.util.concurrent.*;
 
public class ConcurrentLinkedQueueExample {
   public static void main(String[] args) {
      ConcurrentLinkedQueue<int[]> queue = new ConcurrentLinkedQueue<int[]>();
      Thread producer = new Thread(new Producer(queue));
      Thread consumer = new Thread(new Consumer(queue));
      producer.start();
      consumer.start();
  }
}
 
// the producer puts strings on the queue 
class Producer implements Runnable {
  private int[] ligneecrite;
   ConcurrentLinkedQueue<int[]> queue;
   Producer(ConcurrentLinkedQueue<int[]> queue){
      this.queue = queue;
   }
   public void run() {
	  ligneecrite=new int [10];
      System.out.println("Producer Started");
      try {
         for (int i = 1; i < 20; i++) {
        	 ligneecrite[0] = 0;
        	 ligneecrite[1] = i;
        	 ligneecrite[2] = 0;
            queue.add(ligneecrite);
            System.out.println("++ > Added: id contenu dans le 2eme element " + ligneecrite[1]);
            Thread.currentThread().sleep(200);
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}
 
// the consumer removes strings from the queue
class Consumer implements Runnable {
	int[] lignelue;
   ConcurrentLinkedQueue<int[]> queue;
   Consumer(ConcurrentLinkedQueue<int[]> queue){
      this.queue = queue;
   }
   public void run() {
      String str;
      System.out.println("Consumer Started");
      for (int x = 0; x < 20; x++) {
         while ((lignelue = queue.poll()) != null) {
            System.out.println("---- > Removed: id contenu dans le 2eme element " + lignelue[1]);
         }
         try {
            Thread.currentThread().sleep(500);
         } catch (Exception ex) {
            ex.printStackTrace();
         }
      }
   }
}

cela donne :


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
Producer Started
Consumer Started
++ > Added: id contenu dans le 2eme element 1
---- > Removed: id contenu dans le 2eme element 1
++ > Added: id contenu dans le 2eme element 2
++ > Added: id contenu dans le 2eme element 3
---- > Removed: id contenu dans le 2eme element 3
---- > Removed: id contenu dans le 2eme element 3
++ > Added: id contenu dans le 2eme element 4
++ > Added: id contenu dans le 2eme element 5
---- > Removed: id contenu dans le 2eme element 5
---- > Removed: id contenu dans le 2eme element 5
++ > Added: id contenu dans le 2eme element 6
---- > Removed: id contenu dans le 2eme element 6
++ > Added: id contenu dans le 2eme element 7
++ > Added: id contenu dans le 2eme element 8
---- > Removed: id contenu dans le 2eme element 8
---- > Removed: id contenu dans le 2eme element 8
++ > Added: id contenu dans le 2eme element 9
++ > Added: id contenu dans le 2eme element 10
---- > Removed: id contenu dans le 2eme element 10
---- > Removed: id contenu dans le 2eme element 10
++ > Added: id contenu dans le 2eme element 11
++ > Added: id contenu dans le 2eme element 12
++ > Added: id contenu dans le 2eme element 13
---- > Removed: id contenu dans le 2eme element 13
---- > Removed: id contenu dans le 2eme element 13
---- > Removed: id contenu dans le 2eme element 13
++ > Added: id contenu dans le 2eme element 14
++ > Added: id contenu dans le 2eme element 15
---- > Removed: id contenu dans le 2eme element 15
---- > Removed: id contenu dans le 2eme element 15
++ > Added: id contenu dans le 2eme element 16
++ > Added: id contenu dans le 2eme element 17
++ > Added: id contenu dans le 2eme element 18
---- > Removed: id contenu dans le 2eme element 18
---- > Removed: id contenu dans le 2eme element 18
---- > Removed: id contenu dans le 2eme element 18
++ > Added: id contenu dans le 2eme element 19
---- > Removed: id contenu dans le 2eme element 19

> Fonctionnement identique avec Java 1.6 et Java 1.7.


je sèche un peu.... auriez vous une piste ? une autre façon de faire cette fifo de tableaux de int thread safe ?


merci


Merci de votre aide;;