创建比请求更多的线程

时间:2013-02-15 02:12:48

标签: java multithreading

我正在编写一个多线程客户端程序,它监听来自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();
}
 }

2 个答案:

答案 0 :(得分:3)

显示的代码将为每个传入连接创建一个线程。没有了。

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

另一种可能性是你看到的额外线程是由JVM创建的守护程序线程;例如垃圾收集器线程,终结器线程等。或许他们从未真正存在过......而你却误解了一些东西。


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

答案 1 :(得分:0)

  

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

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