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

Java并行网络请求和列表更新,java,multithreading,parallel-processing,network-programming,Java,Multithreading,Parallel Processing,Network Programming,我仅限于AWS上的一台单核机器,但在测量完成所有http请求并检查其结果的时间后,其中两个请求在获取数据时所需的时间总和与其余50个请求所需的时间相同(大约2分钟) 我不想过度膨胀我的代码,但我知道并行和异步可以大大缩短此任务的执行时间。我想在它们自己的线程上启动这两个大请求,这样它们就可以在其他线程运行时发出,但是我现在将这些http请求的结果存储在一个列表中 只要事先初始化数据,您是否可以同时访问列表中的不同(保证)元素?我见过并发列表和并行列表,但其中一个不是并行的,而另一个在每次修改时都

我仅限于AWS上的一台单核机器,但在测量完成所有http请求并检查其结果的时间后,其中两个请求在获取数据时所需的时间总和与其余50个请求所需的时间相同(大约2分钟)

我不想过度膨胀我的代码,但我知道并行和异步可以大大缩短此任务的执行时间。我想在它们自己的线程上启动这两个大请求,这样它们就可以在其他线程运行时发出,但是我现在将这些http请求的结果存储在一个列表中

只要事先初始化数据,您是否可以同时访问列表中的不同(保证)元素?我见过并发列表和并行列表,但其中一个不是并行的,而另一个在每次修改时都会重新分配整个列表,因此这两个选项都不是特别明智的选择


在这种情况下我能做什么?

Java中没有并发列表这样的东西。我假设您指的是一个并发哈希集(使用
newSetFromMap
),而您的“并行列表”指的是
copyonwritearaylist

您完全可以使用前一个选项来存储更新数据

解决异步更新数据问题的更好方法是,只需为工作线程使用一个非线程安全的集合,然后在完成时将它们一次推送到一个用于聚合所有请求的线程安全集合

比如:

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

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

aggregate.addAll(local);
Set aggregate=Collections.newSetFromMap(…);
执行人。执行(…);
...
//工人
Set local=new HashSet();
填充(本地);
加总(本地);

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

您可以创建自己的线程,并将请求列表分派到不同的线程中吗?我尝试过了,得到了一个非常有趣的结果。我有3个数据集。如果我设置了一个Thread[]team=newthread[dataSets.length];然后让它们都旋转,总体吞吐量要高得多,但即使在对(inti=0;I