java - 未从 Set 中移除的元素
问题描述
我有TreeSet
一个比较器:
private final TreeSet<TimedTask> sortedEvents;
public TimedUpdatableTaskList(){
Comparator<TimedTask> comparator = new TimedTaskComparator();
sortedEvents = new TreeSet<>(comparator);
}
该类实现了一种将元素添加到集合中的方法:
public void add(TimedTask task) {
synchronized (sortedEvents) {
sortedEvents.add(task);
log.info("Add task {}:{}", task.getClass().getName(), task);
}
}
添加的TimedTask
s 是这样的:
class AIRepairTask extends TimedTask {
private AsyncEventBus clientServerEventBus;
private final IShip ship;
private final IShipyard shipyard;
public AIRepairTask(LocalDateTime executionTime, IShip ship, IShipyard shipyard) {
super();
setExecutionTime(executionTime);
this.ship = ship;
this.shipyard = shipyard;
}
@Override
public void run() {
ship.repair();
shipyard.removeCompletedRepair(ship);
ship.setAvailable(true);
clientServerEventBus.post(new RepairFinishedEvent(ship));
}
}
然后有一个方法可以遍历元素并最终删除它们:
public void handleClockTick(ClockTick event) {
LocalDateTime now = date.getCurrentDate();
int nbHandledTasks = 0;
synchronized (sortedEvents) {
int initialSize = sortedEvents.size();
boolean moreEvents = true;
while(moreEvents && !sortedEvents.isEmpty()) {
TimedTask task = sortedEvents.first();
Preconditions.checkNotNull(task.getExecutionTime(), "The exectution time of the task may not be null");
if (task.getExecutionTime().isBefore(now)) {
try {
task.run();
boolean removed = sortedEvents.remove(task);
Preconditions.checkArgument(removed, "The Task "+task+" was not removed.");
nbHandledTasks++;
} catch (Exception e) {
e.printStackTrace()
}
} else {
moreEvents = false;
}
}
Preconditions.checkArgument(initialSize - nbHandledTasks == sortedEvents.size(), "List size did not become smaller: initial size "+initialSize+", handled tasks "+nbHandledTasks+", actual list size: "+sortedEvents.size());
}
}
由于基本部分包装在同步块中,因此在迭代元素时集合不应更改。
鉴于try
块中没有异常,最后的前提条件检查应该永远不会失败,但这正是发生的情况:
java.lang.IllegalArgumentException: List size did not become smaller: initial size 41, handled tasks 2, actual list size: 41
这怎么会发生?
解决方案
推荐阅读
- kotlin - 带有聊天机器人的片段论坛崩溃而没有任何错误android studio kotlin
- kubernetes - 一个 Kubernetes 集群可以处理多少个 CR(自定义资源)?
- sql-server - 最大长度为 128。“+”附近的语法不正确
- html - 如何保护我的 html 网站不被 http web 复制器复制?
- php - 我如何在不同的端口服务 laravel 7
- python - 在 Pandas 中,如何将日期索引移动到下一个日历日期
- javascript - 如何引用由 EKS 的容器洞察创建的 CloudWatch 指标?
- java - 如何在 KeyCloak 中分配复合角色
- python - 如何在 macOS Big Sur 上的 Python 2.7 中安装 pip?
- javascript - 从源文件夹中获取图像 (PNG) 文件并使用 Javascript 对其进行压缩,然后下载 zip 文件。(客户端)