【发布时间】:2016-06-08 21:57:12
【问题描述】:
我的主线程产生 2 个线程,它们都需要访问同一个列表。我不确定最好的方法是什么。这是我所拥有的,但我仍然遇到了 concurrentModificationException。
class Parent {
private List<String> data;
public List<String> getData() {
return data;
}
public static void main(String args[]) {
Parent p = new Parent();
p.start();
}
public void start() {
Thread a = new Thread(new A(this)).start();
Thread b = new Thread(new B(this)).start();
}
public A implements Runnable {
private Parent parent;
public A(Parent p) {
parent = p;
}
public void run() {
while (true) {
parent.getData().add("data");
}
}
}
public B implements Runnable {
private Parent parent;
public B(Parent p) {
parent = p;
}
public void run() {
Iterator<String> i = parent.getData().iterator();
while(i.hasNext()) {
// do more stuff with i
i.remove();
}
}
}
}
我的A 类基本上是数据的生产者,B 是消费者。我接受我以错误的方式解决这个问题的可能性。因此,欢迎所有帮助。我只需要能够安全地从一个线程添加到列表并从另一个线程的列表中删除一个项目。提前致谢。
【问题讨论】:
-
不要使用列表代替队列。 java.util.concurrent 包中有大量用于生产者/消费者操作的实用程序。
-
你可能想要一个 BlockingQueue,而不是 List。
-
酷我看看这些。如果我换掉列表,其余的理论上应该没问题吗?
标签: java multithreading list collections