【问题标题】:Returning data from multiple threads Vs accumulating responses从多个线程返回数据与累积响应
【发布时间】:2018-01-13 21:26:31
【问题描述】:

我正在做一个简单的项目,该项目将发送多个 HTTP 请求以检索一些数据,解析来自每个 URL 的响应,并返回包含原始 URL 和有关数据的一些信息的响应(线程使用的原因显然是多个 HTTP 请求)。
如果有适合这种情况的最佳实践,我正在徘徊,这是我想到的选项:
1. 让每个线程发送一个 HTTP 请求。解析数据以获取所需信息并返回信息本身(通过Future<SomeDataType>,或在线程完成后进行简单的DataType getInformation() 调用),然后在原始线程中创建 URL-SomeDataType 对
2. 让每个线程接受一个同步列表/映射的附加参数,线程会将 URL-Information 对添加到其中(列表/映射的相同实例将在所有线程之间共享)。
3. 不太可能的选项 - 让每个线程只提取信息,然后以 1/2 中提到的任何一种方式返回,而不是在主线程中解析所有信息(这会降低性能但需要几乎 0 的同步处理,即不错)

是否有针对类似情况的最佳做法?
谢谢!

【问题讨论】:

  • 选项 2 和 3 从同步的角度来看是等效的。没有区别 - 从请求或处理的数据中传输所有数据。第一个选项既复杂又缓慢。

标签: java multithreading concurrency thread-safety threadpool


【解决方案1】:

在我看来,选项 1 是最简洁的,并且符合最佳实践。实现它的首选方法是使用执行器框架(线程池和 Callables)。选择的理由——

  1. 关注点分离 - 每个线程独立返回其工作的结果。之后,主线程的工作就是获取该结果并以它喜欢的方式进一步处理它(例如,将它放在地图中或将其合并到其他东西中)。将来,如果您找到了一种更好/更简洁的方法来聚合结果 - 这种变化很可能不会影响工作线程本身的工作或返回。

  2. 选项 2 将涉及不必要的同步(尽管您可以使用 ConcurrentHashMap 使其最小化)。更大的问题 - 它混合了主线程和工作线程之间的关注点。工作线程现在“知道”一点关于结果的处理(他们关心的应该只是 - 获取结果)

  3. 如您所说,选项 3 会降低性能。如果每个线程获取的信息彼此独立,则让每个线程解析该信息然后返回它是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多