2015-10-19 94 views
1

我在讀J. Bloch的「Effective Java」,現在我在關於for-eachfor-loop的部分。他提到的三種情況,我們不能使用for-each環,其中之一是以下:L多個集合的並行迭代

並行迭代 - 如果你需要在 平行遍歷多個集合,然後你在需要顯式控制迭代器或索引 變量,以便所有迭代器或索引變量可以在 鎖步中前進(如無意中在上面的示例中所示的buggy卡和骰子 中所示)。

這個案例對我來說不是很清楚,我無法想象一個例子。

我腦海中浮現的第一個想法是,它只是在多個線程中迭代相同的集合,但這可能不是他的意思。我沒有看到任何限制阻止我們這樣做(只讀)。其實:

public class MyRunnable implements Runnable{ 

    private Collection<String> col; 

    //CTOR ommmited 

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

} 

然後我們只是用同一個實例啓動一些線程。所以,我們並不害怕獲得ConcurrentModificationExceptionJavaDocs),因爲我們執行只讀訪問,即使是多線程同時執行也是如此。

怎麼了?

回答

5

我不認爲他同時表示「並行」。

它簡單得多。假設你有兩個集合,並且你需要相同的循環(不是嵌套循環)遍歷它們,每個迭代中取每個集合的第i個元素。你不能用增強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() 
    } 
} 
+0

事實上,聽起來很reasonbable。 –

+0

另請參閱https://stackoverflow.com/questions/1365793/how-to-most-elegantly-iterate-through-parallel-collections – JasonPlutext

1

並行iteration-如果您需要要並行運行 多個集合,則需要對迭代器或索引 變量進行顯式控制,以便所有迭代器或索引變量都可以在 鎖步(如無意中在上面的例子中的越野車卡和骰子 中示出的)。

用簡單的英文lockstep表示同時。這意味着您無法使用for-each同時迭代多個集合。你將不得不使用不同的迭代器( 或循環如圖葉蘭)象下面這樣:

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. 
}