我正在开发一个简单的项目,它将发送多个HTTP请求来检索一些数据,解析每个URL的响应,并返回包含原始URL的响应和一些有关数据的信息(线程使用的原因)显然是多个HTTP请求。)
如果这个场景有最好的练习,我会徘徊,这里有一些选项可以进入我的脑海:
1.让每个线程发送一个HTTP请求。解析数据以获取所需信息并返回信息本身(通过Future<SomeDataType>
或在线程完成后进行的简单DataType getInformation()
调用),然后创建URL-SomeDataType对原始线程
2.让每个线程获取同步列表/映射的附加参数,线程将添加URL-Information对(将在所有线程中共享列表/映射的相同实例)。
3.不太可能的选项 - 让每个线程只提取信息,并以1/2中提到的任何一种方式返回,而不是解析主线程中的所有信息(这将降低性能,但需要几乎0同步处理,这是好的)
类似情况是否有最佳做法? 谢谢!
答案 0 :(得分:0)
在我看来,选项1是最干净的,与最佳实践保持一致。实现它的首选方法是使用执行程序框架(线程池和Callables)。选择的理由 -
关注点分离 - 每个线程独立返回其工作结果。在那之后,主线程的工作就是获取结果并以其喜欢的方式进一步处理(例如将其放入地图中或将其合并到其他内容中)。将来,如果您找到一种更好/更清晰的方法来汇总结果 - 这种变化最有可能不会影响工作者线程本身所做或返回的内容。
选项2将涉及不必要的同步(尽管您可以使用ConcurrentHashMap使其最小化)。更大的问题 - 它混合了主线程和工作线程之间的关注点。工人线程现在“知道”一些关于结果的内容(他们的关注应该只是 - 得到结果)
正如您所说,选项3会降低性能。如果每个线程获取的信息彼此独立,则让每个线程解析该信息然后将其返回是有意义的。