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