首页 > 解决方案 > 线程抛出 java.util.ConcurrentModificationException

问题描述

每次我运行程序时,这个线程都会抛出这个异常,我似乎找不到它的原因。有人可以尝试解释发生这种情况的原因吗?

package GPS.gpsproject;

import GPS.Model.Event;
import GPS.Model.Vehicle;

import java.time.Duration;
import java.time.LocalDate;

import java.util.List;


public class Notify extends Thread {
    private List<Veiculo> vehicles;
    private Controler controler;

    public Notify(List<Veiculo> vehicles, Controlador controler) {
        this.controler= controler;
        this.vehicles= vehicles;   
    }

    @Override
    public void run() {
        while (true) {
            for (Vehicle v : vehicles) {
                for (Event e : v.getEvents()) {
                    if (Duration.between(e.getData().atStartOfDay(), LocalDate.now().atStartOfDay()).toDays() < e.getDiasAntes() && !e.isNotified()) {
                        e.setNotified(true);
                        controler.sendNotification("Notification", e.getDesc());

                }
            }
        }
    }
}

还有一个例外:

Exception in thread "Thread-4" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at GPS.gpsproject.Notifica.run(Notify.java:25)

sendNotification() 方法只是将事件通知给用户

标签: javamultithreadingexceptionjavafxarraylist

解决方案


当 thread2 修改ArrayList(例如,添加新元素)而 thread1 对其进行迭代时

for (Vehicle v : vehicles)

thread1 将抛出ConcurrentModificationException,这称为快速失败。

您可能想使用CopyOnWriteArrayList

这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且迭代器保证不会抛出 ConcurrentModificationException。自创建迭代器以来,迭代器不会反映对列表的添加、删除或更改。


推荐阅读