首页 > 解决方案 > 制作一个迭代的多线程方法

问题描述

我有一个名为的方法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;
}

标签: javamultithreadingarraylistjava-8duplicates

解决方案


似乎您想尽可能利用并行性。首先,我建议测量您的代码,无论是使用命令式方法还是使用顺序流,然后如果您认为并行确实有助于提高性能,那么您可以使用并行流。请参阅此处以帮助决定何时使用并行流

至于完成手头的任务,可以这样做:

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;


推荐阅读