0

我需要在不同的线程中迭代 String 的 ArrayList,我不需要添加或删除项目,只需进行迭代。

我该怎么做?

4

3 回答 3

5

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();
于 2012-04-25T17:59:25.990 回答
1

您可能会遇到的唯一问题是,读取线程访问与发布线程相同的数据。为此,您需要以线程安全的方式传递对另一个线程的引用(即通过使用volatile修饰符声明的字段,AtomicReference以任何其他方式使用或传递读写器线程中的内存屏障,例如传递 aReentrantLocksynchronize块)。注意 - 您不需要同步中对其进行迭代。在阅读列表之前通过内存屏障。

例如(可重入锁):

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 
于 2012-04-25T18:07:15.033 回答
0
 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();
}
于 2012-04-25T18:05:07.443 回答