【问题标题】:Make an iterative multi-threaded method制作一个迭代的多线程方法
【发布时间】:2018-11-18 10:47:57
【问题描述】:

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

【问题讨论】:

  • 看流
  • 可以使用java-8并行流

标签: java multithreading arraylist java-8 duplicates


【解决方案1】:
List<DP> unique = dp_list.stream().parallel().distinct().collect(Collectors.toList());

然后只需找到原始列表和唯一元素列表之间的差异,您就有了重复项。

如果您的项目仅在其中一个字段中是唯一的,那么显然您将需要一个过滤器 - 快速搜索“按键不同的流”可以提供多种方法来做到这一点。

【讨论】:

    【解决方案2】:

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

    void find_duplicates(List<DP> dp_list, DP item){
    
        synchronized(dp_list){
            if(dp_list.contains(item)){
                //Set your flags
            }
        }
    
    
    }
    

    【讨论】:

      【解决方案3】:

      您似乎希望尽可能利用并行性。首先,我建议测量你的代码是使用命令式方法还是使用顺序流然后如果你认为并行可以真的帮助提高性能您可以使用并行流。 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 2017-08-02
        • 1970-01-01
        • 2014-10-23
        相关资源
        最近更新 更多