我想以多线程方式阅读java Collection 的内容。这里有很多具有相同背景的问题,但没有关于特定阅读点的问题。
我有一个整数集合。我只想要几个线程来迭代它,每个线程一次拉一个整数。我想确保所有集合都被迭代,并且没有整数被两个不同的线程拉两次。
坦率地说,我不知道什么有效。我知道迭代器不是线程安全的,但是当谈到只读时我不知道。我做了一些测试来尝试获取线程错误,但没有达到 100% 的确定性:
int imax = 500;
Collection<Integer> li = new ArrayList<Integer>(imax);
for (int i = 0; i < imax; i++) {
li.add(i);
}
final Iterator<Integer> it = li.iterator();
Thread[] threads = new Thread[20];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread("Thread " + i) {
@Override
public void run() {
while(it.hasNext()) {
System.out.println(it.next());
}
}
};
}
for (int ithread = 0; ithread < threads.length; ++ithread) {
threads[ithread].setPriority(Thread.NORM_PRIORITY);
threads[ithread].start();
}
try {
for (int ithread = 0; ithread < threads.length; ++ithread)
threads[ithread].join();
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
编辑:在实际用例中,这个整数中的每一个都用于开始一项密集的工作,例如确定它是否是素数。
上面的例子拉取了没有重复或未命中的整数列表,但不知道是不是偶然。
使用 HashSet 而不是 ArrayList 也可以,但同样,这可能是偶然的。
如果您有一个通用集合(不一定是列表)并且需要以多线程方式提取其内容,您在实践中如何做?