线程抛出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);