java - 制作一个迭代的多线程方法
问题描述
我有一个名为的方法find_duplicates(List<DP> dp_list)
,它采用我的自定义数据类型 DP 的 ArrayList。每个 DP 都有一个名为“ID”的字符串,每个 DP 应该是唯一的。
我的方法遍历整个列表并将没有唯一 ID 的任何 DP 添加到另一个 ArrayList,该方法完成时返回。它还将 DP 的布尔字段isUnique
从 true 更改为 false。
我想让这个方法成为多线程的,因为每个元素的检查都独立于其他元素的检查。但是对于每次检查,线程都需要读取 dp_list。是否可以同时将同一个 List 的读取权限授予不同的线程?您能建议一种使其成为多线程的方法吗?
现在我的代码看起来像这样 -
List<DP> find_duplicates(List<DP> dp_list){
List<DP> dup_list = new ArrayList<>();
for(DP d: dp_list){
-- Adds d to dup_list and sets d.isUnique=false if d.ID is not unique --
}
return dup_list;
}
解决方案
似乎您想尽可能利用并行性。首先,我建议测量您的代码,无论是使用命令式方法还是使用顺序流,然后如果您认为并行确实有助于提高性能,那么您可以使用并行流。请参阅此处以帮助决定何时使用并行流。
至于完成手头的任务,可以这样做:
List<DP> find_duplicates(List<DP> dp_list){
List<DP> dup_list = dp_list.stream() //dp_list.parallelStream()
.collect(Collectors.groupingBy(DP::getId))
.values()
.stream()
.filter(e -> e.size() > 1)
.flatMap(Collection::stream)
.collect(Collectors.toList());
dup_list.forEach(s -> s.setUnique(false));
return dup_list;
}
这将从源创建一个流,然后按元素的 id 对元素进行分组,并保留所有具有重复 id 的元素,最后将isUnique
字段设置为false
;
推荐阅读
- postman - 环境变量的值在 Postman 中重置为 null
- javascript - Javascript WebRTC Firefox:InvalidStateError:无法在稳定中创建答案
- google-people-api - 使用 Google people API 检索联系人时出现 FAILED_PRECONDITION 错误
- visual-studio-code - 在 Visual Studio Code 中选择整行但光标在左侧?
- spring-boot - 为什么zaxxer4.0.0依赖需要zaxxer2.5.1?
- java - RawDatagramSocket Dart 在 Java Android 中的类似实现
- python - Python新建n帧视频比输入视频重
- excel - Excel - 如何仅收集最后 20 个值(数据透视表)
- java - ortools项目无法执行jar,Loader.loadNativeLibraries()错误
- opencv - 使用 socketio 的网络服务器上的视频流仅在第一次工作