Java并行网络请求和列表更新

时间:2017-01-30 01:12:19

标签: java multithreading parallel-processing network-programming

我仅限于AWS上的1核机器,但在测量完成所有http请求并检查其结果的时间之后,其中两个一起需要将剩余的50个请求组合在一起以获取数据的时间(大约2分钟)。

我不想比我更多地膨胀我的代码,但我知道并行性和异步性会严重削减此任务的执行时间。我想在他们自己的线程上启动两个大请求,这样他们就可以在其他线程运行的时候出去,但我现在将这些http请求的结果存储在一个列表中。

只要事先初始化数据,您是否可以同时访问列表的不同(保证)元素?我已经看到并发列表和并行列表,但是一个不是并行的,另一个在每次修改时重新分配整个列表,所以两者都不是特别理智的选项。

在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:0)

Java中没有并发列表这样的东西。我假设您指的是并发哈希集(使用newSetFromMap)和您的"并行列表"是指CopyOnWriteArrayList

您绝对可以使用前一个选项来存储更新数据。

解决异步更新数据问题的一种更好方法是只为工作线程使用非线程安全集合,然后在完成线程安全集合时立即将它们全部推送出来您用来汇总所有请求。

类似于:

Set<Response> aggregate = Collections.newSetFromMap(...);
executor.execute(...);
...

// Workers
Set<Response> local = new HashSet<>();
populate(local);

aggregate.addAll(local);

如果您希望以特定方式订购响应数据,可能需要使用各种同步器,例如将请求1中的所有响应放在一起。如果您只需要从每个工作人员移动一个请求,请使用线程安全传输或单个集合。