繁体   English   中英

单线程池与每个任务的一个线程池

[英]Single thread pool vs one thread pool per task

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

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

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

将整个过程分成3个单独的类肯定会增加凝聚力,这意味着每个班级的责任都会减少,这是一件好事。 另一方面,使这些类中的每一个成为Runnable并具有多个队列将增加应用程序的复杂性(可能是不必要的)。

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

关键是,开始简单并根据需要增加复杂性。

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

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

如果没有,@布拉迪会说得好。 与他不同,我可能会将所有三个类都设置为Runnable ,但这并不意味着您必须使用三个队列,您仍然可以尝试使用单个池和配置文件来查看它是如何工作的。

我不相信有标准方法,这取决于您的要求。

如果你正在写一些快速而又脏的东西,那么你最好有一个游泳池。

如果您正在寻找更具弹性且需要恢复的东西,那么您可以选择几个池。 例如。 如果您持久保存响应,如果您的应用程序死亡,那么当它重新启动时,您只需重新排列响应,而无需再次获取它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM