java - 单线程池与每个任务一个线程池

标签 java multithreading concurrency runnable threadpool

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

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

最佳答案

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

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

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

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

关于java - 单线程池与每个任务一个线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353162/

相关文章:

java.net.SocketException : Software caused connection abort: recv failed; Causes and cures? 异常

java - 如何将 picoCLI 项目变成命令?

java - 有没有办法更改启动线程的名称?

java - HashMap成员的并发修改

java - 在jsonpath中过滤时如何获取第一个元素?

java - 了解修改流的后备集合的副作用

c++ - 你需要只读锁定吗

c++ - 如何为单线程 GUI 应用程序创建额外的工作线程?

具有并发读者的 Golang 缓冲区

java - java中默认可以并发执行实例方法吗?