【发布时间】:2015-04-16 13:37:48
【问题描述】:
我正在尝试找出让多个线程从同一个字符串列表中工作的最佳方法。例如,假设我有一个单词列表,并且我希望多个线程打印出该列表中的每个单词。
这是我想出的。该线程使用了一个while循环,当迭代器有next时,它会打印出来并将其从列表中删除。
import java.util.*;
public class ThreadsExample {
static Iterator it;
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>();
list.add("comet");
list.add("planet");
list.add("moon");
list.add("star");
list.add("asteroid");
list.add("rocket");
list.add("spaceship");
list.add("solar");
list.add("quasar");
list.add("blackhole");
it = list.iterator();
//launch three threads
RunIt rit = new RunIt();
rit.runit();
rit.runit();
rit.runit();
}
}
class RunIt implements Runnable {
public void run()
{
while (ThreadsExample.it.hasNext()) {
//Print out and remove string from the list
System.out.println(ThreadsExample.it.next());
ThreadsExample.it.remove();
}
}
public void runit() {
Thread thread = new Thread(new RunIt());
thread.start();
}
}
这似乎可行,虽然我在运行过程中遇到了一些Exception in thread "Thread-2" Exception in thread "Thread-0" java.lang.IllegalStateException 错误:
线程“Thread-1”中的异常线程“Thread-0”中的异常
java.lang.IllegalStateException 在
java.util.ArrayList$Itr.remove(ArrayList.java:864) 在
RunIt.run(ThreadsExample.java:44) 在
java.lang.Thread.run(Thread.java:745) java.lang.IllegalStateException
在 java.util.ArrayList$Itr.remove(ArrayList.java:864) 在
RunIt.run(ThreadsExample.java:44) 在
java.lang.Thread.run(Thread.java:745)
我这样做是正确的还是有更好的方法让多个线程在同一个字符串池上工作?
【问题讨论】:
-
制作一个启动线程的可运行文件是不必要的复杂。
-
请注意,使用 Iterator.remove() 是一个很好的开始(它会阻止通常的problem of removing items in a loop)。不过,这不是并发访问安全的。
-
在不同的线程中使用相同的迭代器看起来,嗯,很奇怪。常用的方法是使用队列。
标签: java string multithreading