【问题标题】:Parallel iteration on multiple collections多个集合的并行迭代
【发布时间】:2015-10-19 06:35:36
【问题描述】:

我正在阅读 J. Bloch 的“Effective Java”,现在我在关于 for-eachfor-loop 的部分。他提到了我们无法使用for-each循环的三种情况,其中一种情况如下:L

并行迭代——如果需要遍历多个集合 并行,那么您需要显式控制迭代器或索引 变量,以便所有迭代器或索引变量都可以在 锁步(如在错误卡片和骰子中无意展示的那样) 上面的例子)。

这个案子对我来说不是很清楚,我想不出一个例子。

我的第一个想法是,这只是在多个线程中迭代同一个集合,但这可能不是他的意思。我没有看到任何限制阻止我们这样做(只读)。其实:

public class MyRunnable implements Runnable{

    private Collection<String> col;

    //CTOR ommmited

    public void run(){
    for(String s : col){
       //print o, not modify
    }

}

然后我们只需启动一些具有相同实例的线程。因此,我们不怕得到ConcurrentModificationException (JavaDocs),因为我们执行只读访问,即使同时由多个线程执行。

怎么了?

【问题讨论】:

    标签: java collections foreach


    【解决方案1】:

    我不认为他的意思是“并行”和并发。

    这要简单得多。假设您有两个集合,并且您希望相同的循环(不是嵌套循环)对它们进行迭代,并在每次迭代中获取每个集合的 i'th 元素。增强的 for 循环无法做到这一点,因为它隐藏了索引和迭代器。

    您必须使用标准 for 循环(对于有序集合):

    private List<String> one;
    private List<String> two;
    
    public void run(){
        for(int i = 0; i<one.size() && i<two.size();i++){
           // do something with one.get(i) and two.get(i)
        }
    }
    

    或显式迭代器(用于无序集合):

    private Set<String> one;
    private Set<String> two;
    
    public void run(){
        for(Iterator<String> iterOne=one.iterator(),Iterator<String> iterTwo=two.iterator(); iterOne.hasNext()&&iterTwo.hasNext();){
           // do something with iterOne.next() and iterTwo.next()
        }
    }
    

    【讨论】:

    【解决方案2】:

    并行迭代——如果需要遍历多个集合 并行,那么您需要显式控制迭代器或索引 变量,以便所有迭代器或索引变量都可以在 锁步(如在错误卡片和骰子中无意展示的那样) 上面的例子)。

    在简单的英语中,lockstep 的意思是同时。这意味着您不能使用for-each 同时迭代多个集合。您将不得不使用单独的迭代器( 或 Eran 所示的 for 循环),如下所示:

    Iterator iterator1 = list1.iterator();
    Iterator iterator2 = list2.iterator();
    Iterator iterator3 = list3.iterator();
    while (iterator1 .hasNext() && iterator2 .hasNext() && iterator3.hasNext()){
        Item i1 = iterator1 .next();
        Item i2 = iterator2 .next();
        Item i3 = iterator3.next();
        // rest of your code.
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2022-01-02
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2016-09-18
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多