Je travaille actuellement sur la mise en place d'une file d'attente pour l'envoi de paquets de données. cependant, j'ai rencontré un problème où lorsque j'utilise la fonction addLast sur ma LinkedList, elle remplace chaque paire de la liste par la paire que j'ajoute.

La queue:

private LinkedList<Pair<Integer, ByteBuffer>> queue;

Pair a été importé de javafx.util.Pair;

Initialisation de la file d'attente:

queue = new LinkedList<>();

La méthode:

    public synchronized void addToQueue(int bytes, ByteBuffer data) {
        Pair<Integer, ByteBuffer> local = new Pair(bytes, data);
        queue.addLast(new Pair(bytes, data));

        if(bytes>2){
            int i = 0;
            for(Pair<Integer,ByteBuffer> datas:queue ){
                System.out.println("\n Data in the "+i+ "th position in queue is: ");
                printByteBufferAsBytes(datas.getValue(), datas.getKey());
                i++;
            }
        }

    }

Afin de déboguer, j'ai imprimé data chaque fois qu'un paquet de données est envoyé. Cette méthode est également utilisée pour envoyer des paquets plus petits, mais elle semble fonctionner correctement pour les petits paquets.

Lors de l'exécution du code, les résultats suivants sont imprimés:

Data in the 0th position in queue is: 
1 5 40 -128 -58 0 0 42 111 34 -24 0 0 0 0 112 114 105 110 116 66 121 116 101 66 117 102 102 101 114 65 115 something was added to queue

 Data in the 0th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 
 Data in the 1th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 something was added to queue

 Data in the 0th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
 Data in the 1th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
 Data in the 2th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 something was added to queue

 Data in the 0th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 1th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 2th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 3th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40

Il semble que chaque fois qu'un élément est ajouté à la file d'attente, toutes les autres valeurs de la file d'attente sont définies sur la même valeur. Si quelqu'un connaît la raison de cela, j'apprécierais grandement les pointeurs.

Méthode printByteBufferAsBytes:

    public void printByteBufferAsBytes(ByteBuffer bytes, int bytesLength) {
        for (int i = 0; i < bytesLength; i++) {
            System.out.print(Byte.toString(bytes.get(i)) + " ");
        }
    }
0
murky_volvo 14 avril 2020 à 18:59

2 réponses

Meilleure réponse

Dans la méthode addToQueue, vous devez copier le contenu de ByteBuffer mis à jour dans un nouveau tableau d'octets:

    public synchronized void addToQueue(int bytes, ByteBuffer data) {
        byte[] copy = Arrays.copyOf(data.array(), bytes);

        Pair<Integer, ByteBuffer> local = new Pair<>(bytes, ByteBuffer.wrap(copy));
        queue.addLast(local);
    // ... the rest of the method remains as is

   }
1
Alex Rudenko 14 avril 2020 à 17:40

L'implémentation de addLast () sur LinkedList (en Java) est la suivante:

 public void addLast(AnyType item)
   {
      if( head == null)
         addFirst(item);
      else
      {
         Node<AnyType> tmp = head;
         while(tmp.next != null) tmp = tmp.next;

         tmp.next = new Node<AnyType>(item, null);
      }
   }

Il existe une implémentation de Queue en Java , Je recommanderais de l'utiliser au lieu de LinkedList. En outre, les méthodes de retrait et de mise en file d'attente doivent être utilisées pour suivre la terminologie.

Les méthodes enqueue () et dequeue () sur Queue (en Java) sont définies comme suit:

public void enqueue(Item item) {
        Node oldlast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if (isEmpty()) first = last;
        else           oldlast.next = last;
        n++;
        assert check();
    }

public Item dequeue() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        Item item = first.item;
        first = first.next;
        n--;
        if (isEmpty()) last = null;   // to avoid loitering
        assert check();
        return item;
    }

Une petite note sur LinkedLists, la méthode add () est équivalente à addLast ().

0
Sabina Orazem 14 avril 2020 à 17:03