Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多集合上的并行迭代_Java_Collections_Foreach - Fatal编程技术网

Java 多集合上的并行迭代

Java 多集合上的并行迭代,java,collections,foreach,Java,Collections,Foreach,我正在阅读J.Bloch的“有效Java”,现在我在关于for eachvsfor loop的部分。他提到了三种情况,其中我们不能对每个循环使用,其中一种是: 并行迭代-如果需要遍历中的多个集合 并行,则需要对迭代器或索引进行显式控制 变量,这样所有迭代器或索引变量都可以在 锁步(如无意识地在童车卡和骰子中所示) 上面的例子) 这个案子我不太清楚,我无法想象一个例子 我脑海中浮现的第一个想法是,它只是在多个线程中迭代同一个集合,但这可能不是他的意思。我没有看到任何限制阻止我们这样做(只读)。实际

我正在阅读J.Bloch的“有效Java”,现在我在关于
for each
vs
for loop
的部分。他提到了三种情况,其中我们不能对每个循环使用
,其中一种是:

并行迭代-如果需要遍历中的多个集合 并行,则需要对迭代器或索引进行显式控制 变量,这样所有迭代器或索引变量都可以在 锁步(如无意识地在童车卡和骰子中所示) 上面的例子)

这个案子我不太清楚,我无法想象一个例子

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

public class MyRunnable implements Runnable{

    private Collection<String> col;

    //CTOR ommmited

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

}
公共类MyRunnable实现Runnable{
私人收藏;
//斜接
公开募捐{
for(字符串s:col){
//打印o,而不是修改
}
}
然后我们就用同一个实例启动一些线程。因此,我们不怕得到
ConcurrentModificationException
(),因为我们执行只读访问,即使是多个线程同时执行

怎么了?

我不认为他指的是“并行”而不是“并行”

这要简单得多。假设您有两个集合,并且希望同一个循环(而不是嵌套循环)在这两个集合上进行迭代,每次迭代都使用每个集合的
i
第四个元素。使用增强的for循环无法做到这一点,因为它隐藏了索引和迭代器

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

私有列表一;
私人名单二;
公开募捐{
对于(inti=0;i我不认为他指的是“并行”而不是“并行”

这要简单得多。假设您有两个集合,并且希望同一个循环(而不是嵌套循环)在这两个集合上进行迭代,每次迭代都使用每个集合的
i
第四个元素。使用增强的for循环无法做到这一点,因为它隐藏了索引和迭代器

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

私有列表一;
私人名单二;
公开募捐{
对于(int i=0;i
并行迭代-如果您需要遍历中的多个集合
并行,则需要对迭代器或索引进行显式控制
变量,这样所有迭代器或索引变量都可以在
锁步(如无意识地在童车卡和骰子中所示)
上面的例子)

在简单的英语中,lockstep表示同时。它表示您不能同时对多个集合使用
for each
进行迭代。您必须使用单独的迭代器( 或如Eran所示的循环)如下所示:

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.
}
并行迭代-如果您需要遍历中的多个集合 并行,则需要对迭代器或索引进行显式控制 变量,这样所有迭代器或索引变量都可以在 锁步(如无意识地在童车卡和骰子中所示) 上面的例子)

在简单的英语中,lockstep表示同时。它表示您不能同时对多个集合使用
for each
进行迭代。您必须使用单独的迭代器( 或如Eran所示的循环)如下所示:

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

的确,听起来很有道理
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.
}