【问题标题】:Single thread pool vs one thread pool per task单线程池与每个任务一个线程池
【发布时间】:2012-09-03 09:45:34
【问题描述】:

我想在 Java 中使用并发向在线 API 发出请求,下载并解析响应文档,并将结果数据加载到数据库中。

每个线程都在其中请求、解析和加载的线程池是标准的吗?换句话说,只有一个类实现了Runnable。或者说,拥有三个不同的线程池是否更有效,第一个线程池发出请求并将它们推送到队列,第二个线程池从第一个队列轮询,解析并推送解析的数据到第二个队列,最后是第三个池从第二个队列轮询数据并加载到数据库中?在这种情况下,我会编写三个不同的类来实现Runnable

【问题讨论】:

  • 使用流水线模型(即三个池),您可能必须找出池大小的最佳比例,或者动态调整池大小以确保它们是平衡的。即,您需要问自己诸如“如果我有 10 个并发‘下载’线程,我需要多少并发‘解析’线程来确保下载解析队列保持或多或少的恒定大小? i>"

标签: java multithreading concurrency runnable threadpool


【解决方案1】:

需要考虑的重要一点:处理顺序是否重要?即,第一个下载请求的解析结果在第二个请求的结果之前加载到数据库中是否重要? p>

如果是这样,您确实需要队列(或类似的),每个任务一个。实际上,三个单线程线程“池”(或使用 ExecutorService)。

如果不是,@Brady 提出了很好的观点。与他不同,我可能会创建所有三个类Runnable,但这并不意味着您必须使用三个队列,您仍然可以尝试一个池和配置文件来查看它是如何工作的。

【讨论】:

    【解决方案2】:

    我认为没有标准方法,这取决于您的要求。

    如果你写的东西又快又脏,那么你最好有一个池。

    如果您正在寻找更具弹性的东西并且需要恢复,那么您可以选择多个池。例如。如果您坚持响应并且如果您的应用死了,那么当它重新启动时,您可以重新排队响应而无需再次获取它们。

    【讨论】:

      【解决方案3】:

      您必须考虑处理的哪些部分将从并行性中受益。在线 API 通信很可能是候选者,因为会涉及到套接字和网络等待。数据库交互也是如此。如果有多个可用 CPU 内核,多线程解析可能只会提高性能。

      将整个流程拆分成3个独立的类肯定会增加凝聚力,意味着每个类的职责会更少,这是一件好事。另一方面,将这些类中的每一个都设为Runnable 并拥有多个队列会增加应用程序的复杂性(可能是不必要的)。

      我建议创建 3 个单独的类,但不要创建它们 Runnable。然后制作一个Runnablecontainsorchestrates 3 个类,即一个单线程池。如果您发现这似乎不够快(并且在进行了一些分析之后),请尝试将 runnable 拆分为 2 个线程池:一个下载和解析,以及一个 db 访问。

      重点是,从简单开始,然后根据需要增加复杂性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 2015-09-14
        • 2016-10-18
        • 1970-01-01
        • 2010-09-18
        • 2016-05-21
        • 2014-12-02
        相关资源
        最近更新 更多