2 つの同時スレッドを実行しようとしています。1 つはオブジェクトをリストに追加し続け、もう 1 つはこれらのオブジェクトを更新し、これらのオブジェクトの一部をリストから削除することもあります。メソッドとクラスに使用したプロジェクト全体があるArrayList
ため、現在変更するのは困難です。
私は周りを見回して、これを行ういくつかの方法を見つけましたが、私が言ったように、から変更するのは難しいArrayList
. オブジェクトをリストに追加するメソッドと、これらのオブジェクトを変更し、特定の基準を満たした場合に削除する可能性のあるメソッドに対して、 synchronized
andを使用してみました。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
ます。
私はアイデアがないので、どんなガイダンスもいただければ幸いです。ありがとうございました。