Java 创建的线程数超过请求的线程数

Java 创建的线程数超过请求的线程数,java,multithreading,Java,Multithreading,我正在编写一个多线程客户端程序,用于侦听来自web浏览器的连接。我的问题是创建的线程比应该创建的多。例如,如果我在浏览器中键入url,则只应创建一个线程,但在我的情况下,会创建多个线程 public void running() { try { for(;;){ Socket socket=server.accept(); Thread t= new Thread( new ClientHandler(socket));

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

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

如果您获得的线程比预期的多,那么最明显的解释是web浏览器打开的服务器连接比预期的多。例如,浏览器可能试图为您的“站点”获取“favico”。。。或者在尝试获取之前发送一个头部

另一种可能性是,您看到的那些额外线程是由JVM创建的守护进程线程;e、 垃圾收集器线程、终结器线程等等。也许他们根本就不存在。。。你误解了什么



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

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

如果您获得的线程比预期的多,那么最明显的解释是web浏览器打开的服务器连接比预期的多。例如,浏览器可能试图为您的“站点”获取“favico”。。。或者在尝试获取之前发送一个头部

另一种可能性是,您看到的那些额外线程是由JVM创建的守护进程线程;e、 垃圾收集器线程、终结器线程等等。也许他们根本就不存在。。。你误解了什么


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

。例如,如果我在浏览器中键入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();
}
 }
仅当假定浏览器将创建一个连接时。你不知道,证据对你不利。如果URL返回的数据包含图像等的相对URL,浏览器将打开其他连接以同时检索它们

。例如,如果我在浏览器中键入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();
}
 }

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

如何知道每个集合创建了多个线程。你确定没有在JVM中看到所有免费的后台线程吗?我正在打印线程id,线程id大于1或其他什么?线程id如何让您知道有多少线程?如何知道每个集合创建多个线程。你确定没有在JVM中看到所有免费的后台线程吗?我正在打印线程id,线程id大于1或其他什么?线程id如何让您知道有多少线程?