gpt4 book ai didi

java - 线程的运行没有看到它的数组大小增加

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:51 25 4
gpt4 key购买 nike

我目前正在做 Java 作业。我被要求创建一个基本的 DNS 服务器。有一个 UDPSender 类,它是一个监听端口 53 的线程。还有另一个称为 UDPManager 的线程。

UDPManager 使用嵌套的可运行类启动一个线程,该类包含 DatagramPacket 的 ArrayList。 UDPSender 聚合 UDPManager,每当它收到 UDP 数据包时,它会将其发送给管理器,让他将其添加到 arrayList。

import java.net.DatagramPacket;
import java.util.ArrayList;
import java.util.HashMap;


public class UDPManager {
private UDPManagerRunnable manager;

public UDPManager(String hostsFile, String remoteDNS, boolean localResolution) {
manager = new UDPManagerRunnable(hostsFile, remoteDNS, localResolution);
new Thread(manager).start();
}

public void managePacket(DatagramPacket p) {
manager.managePacket(p);
}

public void close() {
manager.close();
}

private class UDPManagerRunnable implements Runnable {
private ArrayList<DatagramPacket> packets;
private HashMap<Integer, String> clients;
private boolean localResolution;
private boolean running;
private String hostsFile;
private String remoteDNS;

public UDPManagerRunnable(String hostsFile, String remoteDNS, boolean localResolution) {
packets = new ArrayList<DatagramPacket>();
clients = new HashMap<Integer, String>();
this.localResolution = localResolution;
this.running = true;
this.hostsFile = hostsFile;
this.remoteDNS = remoteDNS;
}

public void managePacket(DatagramPacket p) {
packets.add(p);
System.out.println("Received packet. "+packets.size());
}

public void close() {
running = false;
}

public void run() {
DatagramPacket currentPacket = null;
while(running) {
if(!packets.isEmpty()) {
currentPacket = packets.remove(0);
byte[] data = currentPacket.getData();
int anCountValue = data[Constant.ANCOUNT_BYTE_INDEX];
if(anCountValue == Constant.ANCOUNT_REQUEST)
this.processRequest(currentPacket);
else if(anCountValue == Constant.ANCOUNT_ONE_ANSWER)
this.processResponse(currentPacket);

}
}

}

private void processRequest(DatagramPacket packet) {
System.out.println("it's a request!");
}

private void processResponse(DatagramPacket packet) {
System.out.println("it's a response!");
}

}

这是 UDPManager。当 System.out.println 正确显示“已接收数据包”时,数据包已正确传输到管理器。并且数组的大小确实增加了。我遇到的问题是在“run()”内部它从未看到大小增加。奇怪的是它在调试时工作得很好。知道为什么它会这样吗?

非常感谢您的帮助。

最佳答案

问题是,您的第一个线程将新数据放入 packets 变量,但对于第二个线程,这是不可见的。您应该同步对数组的访问。

当您启动第二个线程时,将复制所有变量。第二个线程只处理副本。您需要同步对此变量的访问,以便其他线程可以看到更改。

关于java - 线程的运行没有看到它的数组大小增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13446042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com