java - 创建比请求更多的线程

标签 java multithreading

我正在编写一个多线程客户端程序,它监听来自网络浏览器的连接。我的问题是创建的线程比应有的多。例如,如果我在浏览器中输入网址,则应该只有一个线程被创建,但在我的例子中,创建了多个线程。

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();
}
 }

最佳答案

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

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

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

<小时/>

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

关于java - 创建比请求更多的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14887398/

相关文章:

java - 我的图书馆管理项目中出现 SQL 插入错误。我试图弄清楚自己,但多次失败。请帮助我

java - org.apache.axis.message.SOAPBodyElement 无法转换为 weblogic.xml.xmlnode.XMLNode

multithreading - 在标签tkinter上显示视频大小

java - JavaFX ListView 中的 WPF ListView.ItemTemplate 等效项是什么?

java - 一个显示给定类的 javadoc 的 java 程序

java - 如何从 Git 中删除 ".project"文件?

java - Java 中的慢速多线程 - Air Percussion 项目

windows - 如何在 Windows 中以 30 毫秒的间隔执行 10 毫秒 CPU 时间操作?

c# - 我需要锁定列表吗? C#

java - 在方法内声明 HashMap