【发布时间】:2013-02-27 12:50:25
【问题描述】:
我正在尝试运行 2 个并发线程,其中一个不断将对象添加到列表中,另一个更新这些对象并可能从列表中删除其中一些对象。
我有一个完整的项目,我的方法和类都使用了ArrayList,所以现在很难改变它。
我环顾四周,发现了几种方法,但正如我所说,很难从ArrayList 更改。我尝试使用synchronized 和notify() 来将对象添加到列表中,并使用wait() 来更改这些对象并在它们满足特定条件时可能会删除它们。
现在,我已经想出了如何使用CopyOnWriteArrayList 来做到这一点,但我想知道是否有可能使用ArrayList 本身来模拟这一点。这样我就不必编辑我的整个代码了。
所以,基本上,我想做这样的事情,但使用ArrayList:
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class ListExample{
CopyOnWriteArrayList<MyObject> syncList;
public ListExample(){
syncList = new CopyOnWriteArrayList<MyObject>();
Thread thread1 = new Thread(){
public void run(){
synchronized (syncList){
for(int i = 0; i < 10; i++){
syncList.add(new MyObject(i));
}
}
}
};
Thread thread2 = new Thread(){
public void run(){
synchronized (syncList){
Iterator<MyObject> iterator = syncList.iterator();
while(iterator.hasNext()){
MyObject temp = iterator.next();
//this is just a sample list manipulation
if (temp.getID() > 3)
syncList.remove(temp);
System.out.println("Object ID: " + temp.getID() + " AND list size: " + syncList.size());
}
}
}
};
thread1.start();
thread2.start();
}
public static void main(String[] args){
new ListExample();
}
}
class MyObject{
private int ID;
public MyObject(int ID){
this.ID = ID;
}
public int getID(){
return ID;
}
public void setID(int ID){
this.ID = ID;
}
}
我也读过Collections.synchronizedList(new ArrayList()),但我相信这需要我更改我的代码,因为我有大量将ArrayList 作为参数的方法。
任何指导将不胜感激,因为我没有想法。谢谢。
【问题讨论】:
-
尽早重构,经常重构是你想要遵循的口头禅。最好现在而不是以后经历痛苦,将代码更改为使用接口
List,而不是具体实现ArrayList。 -
请注意 - 您应该始终使用需要功能的最低通用对象。如果您不需要
ArrayList实际带来的任何功能,您应该考虑使用List作为您的方法参数。这将为您的应用程序打开更广泛的实现基础 - 只是一个想法 -
您似乎正在尝试解决生产者-消费者问题。尝试用谷歌搜索解决生产者-消费者问题
标签: java multithreading arraylist wait synchronized