Thread的运行没有看到它的数组大小增加

时间:2012-11-19 00:13:29

标签: java multithreading arraylist

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

UDPManager启动一个带有嵌套runnable类的线程,该类包含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()”内部它从未看到大小增加。奇怪的是它在调试中运行得非常好。 知道为什么这样做吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您应该在访问或修改数据包时同步数据包

答案 1 :(得分:-1)

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

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