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