0

別のスレッドで文字列のArrayListを反復する必要があります。反復するためだけに、項目を追加または削除する必要はありません。

どうすればいいですか?

4

3 に答える 3

5

最も基本的な形で、あなたはこのようなことをします。しかし、あなたが私たちに尋ねたよりもあなたの質問にはもっとたくさんのことがあるように思われますか?

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を渡すなど、他の方法でリーダースレッドとライタースレッドのメモリバリアを使用または渡します)。注-同期で繰り返す必要はないことに注意してください。リストを読み取る前に、メモリバリアを通過するだけです。ReentrantLocksynchronize

例(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 
于 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 に答える