簡體   English   中英

關於ConcurrentLinkedQueue

[英]Regarding ConcurrentLinkedQueue

我有一個多線程方案,其中使用了使用Packet類型的ConcurrentLinkedQueue的Sender類。 Packet是定義為的POJO:

class Packet {
    int seq;
    byte[] data;
}

發件人類定義為:

class Sender implements Runnable {
     private static ConcurrentLinkedQueue<Packet> queue;

     public Sender() {
        if (ccl == null)
        ccl = new ConcurrentLinkedQueue<Packet>();
     }

     public static boolean enqueue(Packet p) {
        if (queue == null) {
           queue = new ConcurrentLinkedQueue<Packet>();
        }
        //System.out.println(p.toString());
        return queue.add(p);
     }

     @Override
     public void run() {
       TcpSend tcp = new TcpSend();

       while (true) {
            Packet p = queue.remove(); 
            // some code here
            //System.out.println(p.toString());
            tcp.send(p);
       }
   }
}

從另一個Java類中,我正在將文件讀入字節數組,並將其添加到ConcurrentLinkedQueue。 當我在enqueue()中打印數據包的詳細信息時,我得到了正確的詳細信息。 但是,當我在run()中打印詳細信息時,即從隊列中刪除數據包后,我得到了正確的seq,但是我得到了最后添加到隊列中的打包數據。 對於從隊列中刪除的所有數據包,都會發生這種情況。

通過以下方法添加數據

  public void addPacket() {
    int bytesRead = 0; 
    int seq = 1;  
    byte[] fileInBytes = new byte[1500];
    BufferedInputStream in = new BufferedInputStream(new    
                                            FileInputStream(fileName));

    while((bytesRead = in.read(fileInBytes)) != -1) {   
            Sender.enqueue(new Packet(seq, fileInBytes);
            seq++;
    }
  }

請提出建議。 TIA

您正在使用相同的字節數組( fileInBytes )從流中讀取:

byte[] fileInBytes = new byte[1500];
BufferedInputStream in = new BufferedInputStream(new    
                                        FileInputStream(fileName));

while((bytesRead = in.read(fileInBytes)) != -1) {   
        Sender.enqueue(new Packet(seq, fileInBytes);
        seq++;
}

我猜想Packet的構造函數不會復制字節數組:

class Packet {
    int seq;
    byte[] data;

    public Packet(int seq, byte[] data) {
       this.seq = seq;
       this.data = data;
   }
}

這意味着您所有的Packet.data字段都指向同一個字節數組,每次從流中讀取數據時,該字節數組都會被覆蓋。

您需要使用副本:

byte[] fileInBytes = new byte[1500];
BufferedInputStream in = new BufferedInputStream(new    
                                        FileInputStream(fileName));

while((bytesRead = in.read(fileInBytes)) != -1) {
        byte[] packetBytes = Arrays.copyOf(fileInBytes, bytesRead);
        Sender.enqueue(new Packet(seq, packetBytes );
        seq++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM