Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程抛出java.util.ConcurrentModificationException_Java_Multithreading_Exception_Javafx_Arraylist - Fatal编程技术网

线程抛出java.util.ConcurrentModificationException

线程抛出java.util.ConcurrentModificationException,java,multithreading,exception,javafx,arraylist,Java,Multithreading,Exception,Javafx,Arraylist,每次我运行程序时,这个线程都会抛出这个异常,我似乎找不到它的原因。有人能解释一下发生这种情况的原因吗 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 { p

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

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());

                }
            }
        }
    }
}

当thread2修改
ArrayList
(例如,添加新元素)而thread1使用

用于(车辆v:车辆)

thread1将抛出ConcurrentModificationException,称为fail fast

您可能需要使用:

该数组在迭代器的生命周期内不会更改,因此 干扰是不可能的,迭代器保证不会抛出 ConcurrentModificationException。迭代器将不会反映 自使用迭代器以来对列表的添加、删除或更改 创造


我假设
Notifica
Notify
指的是同一个类(其中一个必须是打字错误)。您正在将
列表
传递给
Notifica
类的构造函数。然后在
run()
方法中迭代该
列表

假设在嵌套for循环中调用的方法不修改
车辆
列表或
事件
的任何内部集合,这意味着在迭代这些集合时,其他线程必须在这些集合中进行结构更改

由于迭代时不应在结构上修改
车辆
,因此可能的解决方案是在构造函数中创建一个副本:

this.vehicles = new ArrayList<>(vehicles);  
this.vehicles=新阵列列表(车辆);

请注意,由于这是一个浅拷贝,因此只有当其他线程不在属于
Veiculo
实例的
Event
s的内部集合中进行结构更改时,这才会起作用。

是否有其他线程修改了
vehicles
列表?是否编译时没有错误?类名为
Notifica
,构造函数名为
Notify
(缺少有效的返回类型),编译单元名为
Notify.java
?或者在没有创建
*.class
(Java 11)的情况下执行?是否
发送通知()
最终会更改事件列表(删除事件)或车辆列表??((Abraços da Alemanha))我只是想知道StackTrace是否同时声明了:类名和文件名name@CarlosHeuberger也许OP重命名了标识符(以便用英语发布问题),但忘记重命名其中一些标识符。不需要第二个线程。如果循环中的任何列表(可能还涉及事件列表)在结构上发生更改,例如在
sendNotification()
@CarlosHeuberger Yes中,也可能会引发异常。
this.vehicles = new ArrayList<>(vehicles);