[英]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.