0

我正在编写一个多线程客户端程序,它侦听来自 Web 浏览器的连接。我的问题是创建的线程多于应有的线程。例如,如果我在浏览器中输入一个 url,应该只创建一个线程但是就我而言,创建了多个线程。

public void running() {

    try {
        for(;;){
        Socket socket=server.accept();
        Thread t= new Thread( new ClientHandler(socket));
        t.start();
         // calls the start method to start a thread which also starts the run method
        System.out.println("Thread id is " +t.getId() );}
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
             public static void main(String[] args) {

    Server server= new Server();
    server.running();
}
 }
4

2 回答 2

3

呈现的代码将为每个传入连接创建一个线程。不再。

如果您获得的线程数比您预期的要多,那么最明显的解释是 Web 浏览器打开的与您的服务器的连接比您预期的要多。例如,浏览器可能会尝试为您的“站点”获取“favico”……或者在尝试 GET 之前发送 HEAD。

另一种可能性是您看到的那些额外线程是由 JVM 创建的守护线程;例如垃圾收集器线程、终结器线程等等。或者,也许它们实际上从未存在过……而您误解了某些东西。


需要注意的另一件事是,使用普通 TCP/IP 套接字实现 HTTP 服务是一个坏主意。正确实现 HTTP 需要做很多工作,而且您可能会得到一点……或很多……错误,导致服务无法与不同的浏览器很好地互操作。最好使用现有的 HTTP“堆栈”;例如,现有的 Web 应用程序服务器/框架,或者可能是 Apache HttpComponents 堆栈。

于 2013-02-15T02:23:47.097 回答
0

.例如,如果我在浏览器中输入一个 url,应该只创建一个线程,但在我的情况下,会创建多个线程。

仅当您假设浏览器将创建一个连接时。你不知道,证据对你不利。如果 URL 返回的数据包含图像等的相对 URL,浏览器将打开其他连接以同时检索它们。

于 2013-02-15T02:44:44.667 回答