我想運行2個併發線程,其中一個向對象不斷添加對象,另一個更新這些對象,並且可能會從列表中刪除部分對象。 我有一個完整的項目,我用我的方法和類ArrayList
,所以現在很難改變它。編輯ArrayList及其對象的多個線程
我環顧四周,發現了一些這樣做的方法,但正如我所說,它很難從ArrayList
更改。我嘗試使用和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'。 – Perception 2013-03-12 05:29:46
就像一個筆記 - 你應該總是使用你需要功能的最低通用對象。如果你不需要'ArrayList'實際帶來的任何功能,你應該考慮使用'List'作爲你的方法參數。這將打開您的應用程序,擴展到更廣泛的實施基礎 - 只是一個想法 – MadProgrammer 2013-03-12 05:31:05
您似乎在努力解決生產者 - 消費者問題。嘗試谷歌它解決生產者 - 消費者問題 – Sach 2013-03-12 05:34:30