我想以多線程的方式將讀取爲一個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也可以,但同樣可能是偶然的。
如果你有一個普通的集合(不一定是列表)並且需要以多線程的方式提取其內容,你在實踐中該如何做?
謝謝!我甚至不知道隊列。改變了我的生活! –