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