我试图根据实例化时赋予它们的权重将对象分为五个单独的组。
现在,我想根据它们的权重将这些对象分为五组。为了做到这一点,必须将每一个都与另一个进行比较。
现在我遇到的问题是这些对象被添加到单独的工作线程上的组中。在对象完成下载图片后,每个都被发送到同步排序功能,该功能与当前在三个组中的所有成员进行比较。
这些组已被设置为两个不同的地图。第一个是 Hashtable,它会导致程序崩溃并抛出未知的 ConcurrencyIssue。当我使用 ConcurrentHashMap 时,数据是错误的,因为它在下一个对象与 ConcurrentHashmap 进行比较之前没有及时删除条目。因此,这会导致逻辑错误并产生仅在一半时间内正确排序的组。
我需要哈希图在下一次排序发生之前立即从地图中删除条目......我认为同步函数可以做到这一点,但它似乎仍然不起作用。
是否有更好的方法来对由工作线程添加到数据结构中的对象进行排序?谢谢!我对这个有点迷茫。
private synchronized void sortingHat(Moment moment) {
try {
ConcurrentHashMap[] helperList = {postedOverlays, chanl_2, chanl_3, chanl_4, chanl_5};
Moment moment1 = moment;
//Iterate over all channels going from highest channel to lowest
for (int i = channelCount - 1; i > 0; i--) {
ConcurrentHashMap<String, Moment> table = helperList[i];
Set<String> keys = table.keySet();
boolean mOverlap = false;
double width = getWidthbyChannel(i);
//If there is no objects in table, don't bother trying to compare...
if (!table.isEmpty()) {
//Iterate over all objects currently in the hashmap
for (String objId : keys) {
Moment moment2 = table.get(objId);
//x-Overlap
if ((moment2.x + width >= moment1.x - width) ||
(moment2.x - width <= moment1.x + width)) {
//y-Overlap
if ((moment2.y + width >= moment1.y - width) ||
(moment2.y - width <= moment1.y + width)) {
}
}
}
}
}
这table.remove(objId)就是问题发生的地方。时刻 A 被发送到排序功能,并且没有问题。添加时刻 B,它重叠,与时刻 A 进行比较。如果时刻 B 的权重小于时刻 A,则一切正常。如果时刻 B 的权重更大并且 A 必须被移除,那么当时刻 C 被排序时,时刻 A 仍将与时刻 B 一起出现在哈希图中。 所以这似乎是逻辑错误所在。
慕后森
相关分类