Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从多线程返回数据与累积响应_Java_Multithreading_Concurrency_Thread Safety_Threadpool - Fatal编程技术网

Java 从多线程返回数据与累积响应

Java 从多线程返回数据与累积响应,java,multithreading,concurrency,thread-safety,threadpool,Java,Multithreading,Concurrency,Thread Safety,Threadpool,我正在做一个简单的项目,它将发送多个HTTP请求来检索一些数据,解析每个URL的响应,并返回包含原始URL和一些数据信息的响应(线程使用的原因显然是多个HTTP请求)。 我想知道是否有针对这种情况的最佳实践,以下是我脑海中突然出现的选项: 1.让每个线程发送一个HTTP请求。解析数据以获取所需的信息并返回信息本身(通过Future,或在线程完成后执行的简单数据类型getInformation()调用),然后在原始线程中创建URL SomeDataType对 2.让每个线程获取同步列表/映射的附加

我正在做一个简单的项目,它将发送多个HTTP请求来检索一些数据,解析每个URL的响应,并返回包含原始URL和一些数据信息的响应(线程使用的原因显然是多个HTTP请求)。
我想知道是否有针对这种情况的最佳实践,以下是我脑海中突然出现的选项:
1.让每个线程发送一个HTTP请求。解析数据以获取所需的信息并返回信息本身(通过
Future
,或在线程完成后执行的简单
数据类型getInformation()
调用),然后在原始线程中创建URL SomeDataType对
2.让每个线程获取同步列表/映射的附加参数,该线程将向其中添加URL信息对(列表/映射的同一实例将在所有线程之间共享)。
3.不太可能的选择-与解析主线程中的所有信息相比,让每个线程只提取信息,并以1/2中提到的任何一种方式返回(这将降低性能,但几乎需要0个同步处理,这很好)

类似场景是否有最佳实践?

谢谢

在我看来,选项1是最干净的,符合最佳实践。实现它的首选方法是使用executor框架(线程池和可调用项)。选择的理由-

  • 关注点分离-每个线程独立返回其工作的结果。在那之后,主线程的工作就是获取结果并以它喜欢的方式进一步处理它(例如,将其放入地图或将其合并到其他内容中)。在将来,如果您找到一种更好/更干净的聚合结果的方法,那么这种更改很可能不会影响工作线程本身所做的事情或返回的结果

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

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


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