0

それは私のコードの一部です:

public List<Integer> _list = new ArrayList<>();

public void removeInteger(Integer i)
{
    _list.remove(i);
}

public class CheckThread implements Runnable
{
    @Override
    public void run()
    {
        synchronized(_list) 
        {
            Iterator<Integer> it=_list.iterator(); 
            while(it.hasNext()) 
            {
                Integer i = it.next();
            }
        }
    }
}

スレッドは常に実行されており(その部分は書きませんでした)、removeIntegerメソッドを使用してリストから削除すると、ConcurrentModificationExceptionが発生しました。その問題を解決する方法はありますか?

4

4 に答える 4

2

要素を削除する必要がある場合は、it.remove()を使用する必要があります。

于 2012-10-23T12:23:32.253 に答える
0

-メソッドを実行する必要 がありますsynchronize remove()。そうしないと、他のスレッドがリストにアクセスして、他のスレッドが要素をリストに追加している間に要素を削除しようとする可能性があります..

 public  synchronized void removeInteger(Integer i)
{
    _list.remove(i);
}
于 2012-10-23T12:23:42.250 に答える
0
  • 条件に基づいて反復しながら削除する場合は、while ループ内に条件を記述します。以下のように、反復子の it.remove() を使用してオブジェクトを削除できます。

            Iterator<Integer> it=_list.iterator(); 
            while(it.hasNext()) 
            {
                Integer i = it.next();
                if(i<10){
                  it.remove();
                }
            }
    
于 2012-10-23T12:48:44.773 に答える
0

以下のようなことを試すことができます(要件に応じて状態を改善できます)

public void removeInteger(Integer i)
{
    Iterator iter = _list.iterator();
    int count=0;
    while(iter.hasNext()){
         if(count==i){
             _list.remove(i);
             break;
         }
    }
}
于 2012-10-23T14:12:14.163 に答える