사례 1 : 이로 인해 ConcurrentModificationException
?이 발생하지 않습니다. 누구나 왜이 때문에 ConcurrentModificationException이 발생하지 않는지 알 수 있습니까?누구나 ConcurrentModificationException을 통해 나를 설명 할 수 있습니까?
public class UpdatePeople {
List <People> records = new ArrayList <People>();
public class AsyncTask extends AsyncTask < Void, Void, Boolean > {
List <People> people;
public AsyncTask(List <People> allergy) {
this.people = people;
}@
Override
protected Boolean doInBackground(Void...params) {
List <String> responses = new ArrayList <String>();
for (People peopleList: this.people) {
}
}
}
}
사례 2 : 내가 스레드로부터 안전하지 않습니다 내 AsyncThread에있는 사람들의 목록에 액세스하려고 이것은 ConcurrentModificationException
됩니다. 사람들 목록에 CopyOnWriteArrayList
을 구현하여 스레드로부터 안전하게 만들 수 있습니다.
public class UpdatePeople {
List <People> records = new ArrayList <People>();
public class AsyncTask extends AsyncTask < Void, Void, Boolean > {
@
Override
protected Boolean doInBackground(Void...params) {
List <String> responses = new ArrayList <String>();
for (People peopleList: records) {
}
}
}
}
- 는 사람이 정확히
case 1
에서 무슨 일이 일어나고 있는지 설명해 수 있습니다. 이것이ConcurrentModificationException
문제를 어떻게 해결하는지 이해할 수 없습니다. - 케이스 2가
ArrayList
에서CopyOnWriteArrayList
으로 구현을 변경 했습니까?05-28 20 : 34 : 21.073 : E가/XXX (904) : 예외 uncaught이다 : 05-28 20 : 34 : 21.073 :
예외를 추가 E/XXX (904) : java.lang.RuntimeException : doInBackground()를 실행하는 동안 오류가 발생했습니다. 05-28 20 : 34 : 21.073 : E/XXX (904) : android.os.AsyncTask $ 3.done (AsyncTask.java : 299) 05-28 20 : 34 : 21.073 : E/XXX (904) : 에서 java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) 05-28 20 : 34 : 2 1.073 : E/XXX (904) : java.util.concurrent.FutureTask.setException (FutureTask.java:124) 05-28 20 : 34 : 21.073 : E/XXX (904) : java.util. 동시. FutureTask $ Sync.innerRun (FutureTask.java:307) 05-28 20 : 34 : 21.073 : E/XXX (904) : java.util.concurrent.FutureTask.run (FutureTask.java:137) 05 -28 20 : 34 : 21.073 : E/XXX (904) : android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) 05-28 20 : 34 : 21.073 : E/XXX (904) : 에서 java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1076) 05-28 20 : 34 : 21.073 : E/XXX (904) : 에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:569) 05-28 20 : 34 : 21.073 : E/XXX (904) : 에서 java.lang.Thread.run (Thread.java:856) 05-28 20 : 34 : 21.073 : E/XXX (904) : 발생 원인 : java .util.ConcurrentModificationException 05-28 20 : 34 : 21.073 : E는/XXX (904)의 java.util.ArrayList $ ArrayListIterator.next (ArrayList.java:569)에
일반적
질문에 "(people peopleList : records) for"루프 내부에있는 예외 및 코드 메시지를 추가하십시오. – mschenk74
@ mschenk74 : 내가 얻은 두 번째 사례의 예외가 루프에 있습니다. for (People peopleList : records) – theJava
오브젝트 위에 iterator가있는 동안 오브젝트를 수정하기 위해 손을 쳤습니다. –