制作迭代的多线程方法

时间:2018-06-08 11:21:16

标签: java multithreading arraylist java-8 duplicates

我有一个名为find_duplicates(List<DP> dp_list)的方法,它采用我的自定义数据类型DP的ArrayList。每个DP都有一个名为“ID”的字符串,每个DP都应该是唯一的。

我的方法遍历整个列表,并将任何没有唯一ID的DP添加到另一个ArrayList,该方法在方法完成时返回。它还将DP的布尔字段isUnique从true更改为false。

我想让这个方法成为多线程的,因为元素的每次检查都独立于其他元素的检查。但是对于每次检查,线程都需要读取dp_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;
}

3 个答案:

答案 0 :(得分:1)

List<DP> unique = dp_list.stream().parallel().distinct().collect(Collectors.toList());

然后只需找到原始列表与唯一元素列表之间的差异,即可获得重复项。

显然,如果您的项目仅由其中一个字段唯一,那么您将需要一个过滤器 - 快速搜索&#34;按键排序&#34;可以提供多种方法来实现这一目标。

答案 1 :(得分:1)

似乎您希望在可能的情况下利用并行性。首先,我建议使用命令式方法测量代码,或使用顺序流然后,如果您认为通过并行可以真正帮助提高性能然后你可以使用并行流。 see here to help decide when to use a parallel stream

至于完成手头的任务,可以按如下方式完成:

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;

答案 2 :(得分:0)

有更好的方法可以做到这一点。 您需要做的就是获取list的锁定并检查项目是否存在,然后进一步处理。

void find_duplicates(List<DP> dp_list, DP item){

    synchronized(dp_list){
        if(dp_list.contains(item)){
            //Set your flags
        }
    }


}