java - put() 之后哈希表仍为空

标签 java multithreading hashtable

我在此类中使用 Hastable 时遇到问题:

public class HttpBuilder {
    ...        
    private int ret;
    public Hashtable headers;
    private String content;

    HttpBuilder(int majorv, int minorv, int ret){
        ver[0] = majorv;
        ver[1] = minorv;
        this.ret = ret;
        headers = new Hashtable();
    }

    ...
    public void addHeader(String header, String value){
        headers.put(header, value);
    }

    ...
}

此类从多个输入参数构建一个字符串。我在多个线程中使用它。像这样的事情:

HttpBuilder Get(HttpParser request) {
    HttpBuilder response;
    String doc;
    if (request.getRequestURL().equals("/")) {
        try {
            doc = LoadDoc("main.html");
        } catch (IOException e) {
            response = new HttpBuilder(1, 1, 500);
            return response;
        }
        response = new HttpBuilder(1, 1, 200);
        response.addHeader("content-type", "text/html");
        response.setContent(doc);
    } else {
        response = new HttpBuilder(1, 1, 404);
    }
    return response;
}

addHeader之后Hashtable为空。 消耗数据:

public String toString() {
        String result;
        int len = 0;
        result = "HTTP/"+Integer.toString(ver[0])+"."+Integer.toString(ver[1])+
                " "+getHttpReply(ret)+"\n";
        if(content!=null){
            len = content.length();
            if(len!=0){
                headers.put("content-length", Integer.toString(len));
            }
        }

        Iterator it = headers.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry) it.next();
            result += pairs.getKey() + ": " + pairs.getValue() + "\n";
            it.remove();
        }

        if(len!=0){
            result+="\n"+content;
        }


        return result;
    }

我使用 HttpBuilder 的线程类

class ClientThread implements Runnable {
    private Socket socket;
    private ServerData data;
    static public final String NotImplemented = "HTTP/1.1 501 Not Implemented";
    static public final String NotFound = "HTTP/1.1 404 Not Found";

    ClientThread(Socket socket, ServerData data) {
        this.socket = socket;
        this.data = data;
    }

    @Override
    public void run() {
        try {
            HttpParser request = new HttpParser(socket.getInputStream());
            HttpBuilder response;
            if (request.parseRequest() != 200) {
                response = new HttpBuilder(1, 1, 501);
            } else {
                if (request.getMethod().equals("GET")) {
                    response = Get(request);
                } else if (request.getMethod().equals("POST")) {
                    response = Post(request);
                } else {
                    response = new HttpBuilder(1, 1, 400);
                }
            }
        } catch (IOException e) {
            Server.log.log(Level.SEVERE, e.getLocalizedMessage());
        } finally {
            try {
                socket.close();
                Server.log.log(Level.INFO, "Close connection");
            } catch (IOException e) {
                Server.log.log(Level.SEVERE, e.getLocalizedMessage());
            }
        }
    }

    void send(String response) throws IOException {
        PrintWriter out;
        out = new PrintWriter(socket.getOutputStream(), true);
        out.print(response);

    }

    String LoadDoc(String doc) throws IOException {
        final String Folder = "web" + File.separator;
        String result = null;
        doc = Folder + doc;
        long len;
        File f = new File(doc);
        FileReader fr = new FileReader(f);
        len = f.length();
        char[] buffer = new char[(int) len];
        fr.read(buffer);
        result = new String(buffer);
        fr.close();
        return result;

    }

    HttpBuilder Get(HttpParser request) {
        HttpBuilder response;
        String doc;
        if (request.getRequestURL().equals("/")) {
            try {
                doc = LoadDoc("main.html");
            } catch (IOException e) {
                response = new HttpBuilder(1, 1, 500);
                return response;
            }
            response = new HttpBuilder(1, 1, 200);
            response.addHeader("content-type", "text/html");
            response.setContent(doc);
        } else {
            response = new HttpBuilder(1, 1, 404);
        }
        return response;
    }

    HttpBuilder Post(HttpParser request) {
        HttpBuilder response;
        String str;
        if(request.getRequestURL().equals("/")){
            response = new HttpBuilder(1,1, 200);
            str = request.getContentParam("user");
            response.setContent(str+" added to the base.");
        }else {
            response = new HttpBuilder(1, 1, 404);
        }
        return response;
    }    

}

最佳答案

toString() 中修改对象似乎是个坏主意。 toString() 的目的是返回对象的字符串表示形式。对 toString() 的多次后续调用应返回相同的结果。

当您迭代 toString() 中的 header 时,您将删除 header :

    Iterator it = headers.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry) it.next();
        result += pairs.getKey() + ": " + pairs.getValue() + "\n";
        it.remove();
    }

如果这是所需的行为,我建议您为此逻辑使用具有不同名称的方法。

由于 toString() 重写了 Object 的方法,因此有可能在您不希望调用它的地方调用它,并清空 header 映射。

关于java - put() 之后哈希表仍为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367120/

相关文章:

java - 在流中使用可选

multithreading - Delphi并行处理字符串完全可用CPU使用率

c# - 如何将散列键与 C# 中的值列表映射?

python - Pandas 在 Mac OS X 上的安装 : ImportError (cannot import name hashtable)

java - 如何使用 onClick 在 startService() 和 stopService() 之间切换?

java - 减少 Java Lambda 函数部署包中 jar 文件的数量

java - 由于 SIGSEGV 导致 JVM 崩溃

c++ - 有一种弱互斥概念吗?

c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态

java - 如何从哈希表中检索 ArrayList<String> 的键?