[英]Single thread pool vs one thread pool per task
我想在Java中使用并发来向在线API发出请求,下载并解析响应文档,并将结果数据加载到数据库中。
拥有一个线程池是否标准,每个线程请求,解析和加载? 换句话说,只有一个类实现了Runnable
。 或者更有效的是拥有三个不同的线程池,第一个线程池发出请求并将它们推送到队列,第二个线程池从第一个队列轮询,解析并推送解析的数据到第二个队列,最后第三个池从第二个队列轮询数据并加载到数据库中? 在这种情况下,我会编写三个实现Runnable
不同类。
您必须考虑处理的哪些部分将从并行性中受益。 在线API通信很可能是候选者,因为将涉及套接字和网络等待。 与DB交互相似。 如果有多个可用的 CPU核心,多线程解析可能只会提高性能。
将整个过程分成3个单独的类肯定会增加凝聚力,这意味着每个班级的责任都会减少,这是一件好事。 另一方面,使这些类中的每一个成为Runnable
并具有多个队列将增加应用程序的复杂性(可能是不必要的)。
我建议制作3个单独的类,但不要让它们成为Runnable
。 然后创建一个contains
和orchestrates
3个类的Runnable
,即一个单独的线程池。 如果您发现这看起来不够快(并且在进行一些分析之后),请尝试将runnable拆分为2个线程池:下载和解析以及db访问。
关键是,开始简单并根据需要增加复杂性。
需要考虑的一件重要事情是: 处理的顺序是否重要 ? 即,在第二次请求的结果之前 , 第一次下载请求的解析结果是否被加载到数据库中是否重要?
如果是这样,你真的需要队列(或类似),每个任务一个。 实际上,三个单线程线程“池”(或使用ExecutorService)。
如果没有,@布拉迪会说得好。 与他不同,我可能会将所有三个类都设置为Runnable
,但这并不意味着您必须使用三个队列,您仍然可以尝试使用单个池和配置文件来查看它是如何工作的。
我不相信有标准方法,这取决于您的要求。
如果你正在写一些快速而又脏的东西,那么你最好有一个游泳池。
如果您正在寻找更具弹性且需要恢复的东西,那么您可以选择几个池。 例如。 如果您持久保存响应,如果您的应用程序死亡,那么当它重新启动时,您只需重新排列响应,而无需再次获取它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.