【问题标题】:Java Thread PerformanceJava 线程性能
【发布时间】:2009-06-26 03:24:12
【问题描述】:

我正在开发一个 bittorrent 客户端。在与同行交流时,我与他们交流的最简单方法是为每个人生成一个新线程。但是,如果用户想与大量对等点保持连接,我会导致我产生大量线程。

我想到的另一个解决方案是让一个线程遍历对等对象并运行它们一段时间。

我主要在 ruby​​ 中检查了其他库(我的是在 java 中),它们为每个新对等点生成一个线程。如果用户将连接数设置为 100 或 200 这样的高数值,您认为生成一个线程会降低性能吗?

【问题讨论】:

    标签: java multithreading bittorrent peer-wire-protocol


    【解决方案1】:

    除非您运行数千个线程,否则这应该不是问题。我会考虑妥协,使用线程池。您可以在运行时检测 CPU 的数量,并据此决定启动多少线程,然后将工作分配给线程池。

    【讨论】:

      【解决方案2】:

      您可以使用Non-blocking IO (java.nio.*) 完全避免该问题。

      【讨论】:

        【解决方案3】:

        我建议使用 Executor 来保持池中的线程数。

        Executors.newFixedThreadPool(numberOfThreads);
        

        有了这个,你基本上可以将“任务”添加到池中,一旦线程可用,它们就会完成。这样,您就不会耗尽最终用户计算机的所有线程,同时仍然可以完成很多工作。如果您将其设置为 16,您将非常安全,尽管您始终可以允许用户更改此数字,如果他们愿意的话。

        【讨论】:

        • +1!既然已有很好的方法可以为您编写代码,为什么还要编写代码?
        【解决方案4】:

        没有.....

        有一次我有同样的疑问并创建了一个 .net 应用程序(4 年前),它有 400 个线程......

        如果他们不做很多工作,有一台像样的机器你应该没问题...

        【讨论】:

          【解决方案5】:

          几百个线程对于大多数工作站级机器来说不是问题,而且更容易编码。

          但是,如果您有兴趣追求自己的想法,可以使用 Java 的 NIO 包提供的non-blocking IO featuresJean-Francois Arcand's blog 包含许多从为 Glassfish 创建 Grizzly 连接器中学到的好技巧。

          【讨论】:

          • 我没有与 nio 合作过,我只在这里和那里阅读了几篇文章,但我认为我的第二个计划接近 nio 路线,而不是迭代对等节点我迭代选择器?蔚来还会带来什么样的优势?
          • 我不明白您所说的迭代对等对象的确切含义。在某些时候,必须从套接字读取数据。如果没有 NIO 提供的非阻塞,线程会卡在第一个响应慢的 peer;解除该线程的唯一方法是让套接字读取超时,这会引发异常。
          【解决方案6】:

          例如,在 32 位 Windows 中,实际上您可以创建的本机线程的最大数量(2 Gigs /(线程数 * ThreadStackSize(默认为 2MB))或类似的东西)。因此,如果连接太多,您可能会用完虚拟内存地址空间。 我认为妥协可能会奏效:使用线程池,例如10 个线程(取决于机器)运行并平均分配连接。在线程内部循环通过分配给此线程的对等方。并限制最大连接数。

          【讨论】:

            【解决方案7】:

            使用线程池,使用相当大的池大小(100 左右)应该是安全的。 CPU 不会成为问题,因为您与这种类型的应用程序是 IO 绑定的。

            您可以轻松地使池大小可配置并设置合理的最大值,以防止所有线程出现与内存相关的问题。当然,只有在实际使用所有线程时才会发生这种情况。

            【讨论】:

              猜你喜欢
              • 2011-12-15
              • 2012-08-14
              • 1970-01-01
              • 1970-01-01
              • 2013-10-16
              • 1970-01-01
              • 2011-10-07
              • 2011-03-25
              • 2011-05-01
              相关资源
              最近更新 更多