我想以多线程的方式将读取为一个java集合的内容。在相同的背景下,这里有很多问题,但没有具体的读取点。以线程安全的方式获取集合的内容
我有一个整数的集合。我只是想要几个线程来遍历它,每个线程一次拉一个整数。我想确保所有集合都被迭代,并且没有整数被两个不同的线程拉两次。
坦率地说,我不知道什么是有效的。我知道迭代器不是线程安全的,但是当涉及到只读时,我不知道。我做了一些测试,以尝试并获得线故障,但没有达到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也可以,但同样可能是偶然的。
如果你有一个普通的集合(不一定是列表)并且需要以多线程的方式提取其内容,你在实践中该如何做?
谢谢!我甚至不知道队列。改变了我的生活! –