Javaコレクションのコンテンツをマルチスレッドで読みたいと思います。ここでは同じコンテキストで多くの質問がありましたが、特定の読み取りポイントについてはありません。
整数のコレクションがあります。複数のスレッドがそれを反復処理し、各スレッドが一度に1つの整数をプルするようにしたいだけです。すべてのコレクションが繰り返されていること、および2つの異なるスレッドによって整数が2回プルされていないことを確認したいと思います。
率直に言って、私は何がうまくいくのかわかりません。イテレータがスレッドセーフではないことは知っていますが、読み取り専用になるとわかりません。スレッド障害を取得するためにいくつかのテストを行いましたが、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);
}
編集:実際のユースケースでは、この整数のそれぞれは、素数であるかどうかを見つけるなど、集中的な作業を開始するために使用されます。
上記の例では、重複やミスなしで整数のリストを取得していますが、それが偶然であるかどうかはわかりません。
ArrayListの代わりにHashSetを使用することも同様に機能しますが、これも偶然かもしれません。
一般的なコレクション(必ずしもリストである必要はありません)があり、そのコンテンツをマルチスレッド方式でプルする必要がある場合、実際にはどのように行いますか?