java - 线程抛出 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() 方法只是将事件通知给用户
解决方案
当 thread2 修改ArrayList
(例如,添加新元素)而 thread1 对其进行迭代时
for (Vehicle v : vehicles)
thread1 将抛出ConcurrentModificationException
,这称为快速失败。
您可能想使用CopyOnWriteArrayList
:
这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且迭代器保证不会抛出 ConcurrentModificationException。自创建迭代器以来,迭代器不会反映对列表的添加、删除或更改。
推荐阅读
- c# - 在不同线程中使用 Session 的 ASP.NET Webforms
- javascript - Vue/Webpack/Typescript - 如何使用 jQuery 插件
- windows - 詹金斯无法删除工作区
- html - 使用 scrapy 和 xpath 在 ::before 和 ::after 之间抓取 HTML 元素
- vb.net - vb.net 向进程发送登录名和密码
- selenium - 无法通过类型属性或 xpath 定位登录框
- mysql - 比目前更快地导出/导入数据库
- java - 无法在Java中使用帖子正文重定向
- java - 计算填充以使矩形居中对齐(按百分比调整大小)
- java - 为什么 java action System.out 在 Oozie 中执行时会消失?