我需要在不同的线程中迭代 String 的 ArrayList,我不需要添加或删除项目,只需进行迭代。
我该怎么做?
Weill 在其最基本的形式中,你会做这样的事情。但是您的问题似乎比您问我们的要多得多?
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
以任何其他方式使用或传递读写器线程中的内存屏障,例如传递 aReentrantLock
或synchronize
块)。注意 - 您不需要在同步中对其进行迭代。在阅读列表之前通过内存屏障。
例如(可重入锁):
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();
}