別のスレッドで文字列のArrayListを反復する必要があります。反復するためだけに、項目を追加または削除する必要はありません。
どうすればいいですか?
最も基本的な形で、あなたはこのようなことをします。しかし、あなたが私たちに尋ねたよりもあなたの質問にはもっとたくさんのことがあるように思われますか?
final List<Item> items = new ArrayList<Item>();
items.addAll(stuff);
new Thread(new Runnable() {
public void run() {
for (Item item: items) {
System.out.println(item);
}
}
}).start();
これで発生する可能性がある唯一の問題は、読み取りスレッドが発行者スレッドと同じデータにアクセスすることです。そのためには、スレッドセーフな方法で他のスレッドへの参照を渡す必要があります(つまり、volatile
修飾子で宣言されたフィールドを介して、またはブロックAtomicReference
を渡すなど、他の方法でリーダースレッドとライタースレッドのメモリバリアを使用または渡します)。注-同期内で繰り返す必要はないことに注意してください。リストを読み取る前に、メモリバリアを通過するだけです。ReentrantLock
synchronize
例(ReentrantLock):
private final ReadWriteLock lock = new ReentrantReadWriteLock();
final Lock w = lock.writeLock();
w.lock();
try {
// modifications of the list
} finally {
w.unlock();
}
.................................
final Lock r = lock.readLock();
r.lock();
try {
// read-only operations on the list
// e.g. copy it to an array
} finally {
r.unlock();
}
// and iterate outside the lock
Thread splashThread = new Thread() {
@Override
public void run() {
List<String> mylist = new ArrayList<String>();
mylist.add("I");
mylist.add("Am");
mylist.add("definitely");
mylist.add("becoming");
mylist.add("a");
mylist.add("better");
mylist.add("programmer");
Iterator<?> i1 = mylist.iterator();
while (i1.hasNext()) {
System.out.println(i1.next());
}
}
};
splashThread.start();
}