当前位置: 首页 > 知识库问答 >
问题:

java.util.树图中的异常

周睿范
2023-03-14
public class StoreMessage extends Thread implements Serializable{

    private static long start_nanotime=System.nanoTime();
    private static int timeToRun = 60000; 
    private static byte[] b=null;
    private static long startTime = System.currentTimeMillis();
    private static long runUntilMillis = System.currentTimeMillis() + timeToRun;
    public static Map <Long,Message> map1=new TreeMap<Long,Message>();

public static void store(Message message)throws Exception{
        while (true) {
            long now = System.currentTimeMillis();
            if (now >= runUntilMillis) {
               break;
            }
            long precise_time=TimeUnit.MILLISECONDS.toNanos(now)+(System.nanoTime()-start_nanotime);
            map1.put(precise_time, message);
           }
     }

public static byte[] returning()throws Exception
    { 

        b=serializer.serialize(map1);
        System.out.println(b);
        map1.clear();
        return b;


    }
}

我试图做的是,将StoreMessage类每一分钟接收到的所有消息对象存储到一个树映射中,序列化该树映射并将其返回给调用它的类,然后在下一分钟创建/清除树映射以存储其他消息对象
Message类的Message对象是jms文本消息,作为命令行参数输入。store方法在另一个类中调用,而returning()方法在另一个类中调用。这两个类在实例化和运行时都有多个参数,这给了我一个异常

java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1100)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1136)
at java.util.TreeMap$EntryIterator.next(TreeMap.java:1131)
at java.util.TreeMap.writeObject(TreeMap.java:2250)

为什么?尤其是在我清理地图的时候。如果我只给出一个命令行参数,我不会得到这个异常。但如果它被反复遵守,我会得到同样的例外<然后,当它们被序列化为消息时,它们被存储为trebr。当我希望树映射存储消息一分钟,然后序列化整个批次时。

共有3个答案

夹谷星剑
2023-03-14

从理论上讲,即使使用同步地图,也可能丢失一条消息。如果在系统运行时调用存储。出来正在进行println()。这是在序列化之后但在清除之前。

所以我认为你可以在地图上同步(但我没有测试它):

public static void store(Message message) throws Exception {
    while (true) {
        long now = System.currentTimeMillis();
        if (now >= runUntilMillis) {
            break;
        }
        long precise_time = TimeUnit.MILLISECONDS.toNanos(now)
                + (System.nanoTime() - start_nanotime);
        synchronized (map1) {
            map1.put(precise_time, message);
        }
    }
}

public static byte[] returning() throws Exception {

    synchronized (map1) {
        b = serializer.serialize(map1);
        System.out.println(b);
        map1.clear();
    }
    return b;
}
戚翰飞
2023-03-14

其他答案很接近,但我不相信它们是完整的。如果查看抛出的CME,它位于树映射迭代器中,即使将其设置为synchronizedMap,也不会使其成为线程安全的。在迭代期间,您仍然必须在树映射上显式同步(在本例中,似乎是序列化)。

何时使用迭代器的集合

夏侯鹏
2023-03-14

java。util。同时发生的ConcurrentSkipListMap是线程安全树映射的实现,它将保持自然的顺序

Map<String, String> treeMap = new ConcurrentSkipListMap<String, String>();

我们可以获得不可修改(只读)版本,如下所示:

TreeMap tM = new TreeMap();
Map tM2 = Collections.unmodifiableMap(tm1);

现在MaptM2是只读的。

 类似资料:
  • 这是基于我的这个线程和相同的代码:避免在顶点之间创建多个边(java.util、linkedList、Graph)。我想我没有理解关于链表的一些重要的东西,那就是:我不知道如何访问代码生成的几个链表中的一个特定列表中的数组和项。 由于g是一个图,而该图是一个链表数组,所以我认为使用g[I]访问每个链表是有意义的。但这是我错误的猜测,因为尝试: 抛出错误。那么,我如何访问每个链表?这会很有帮助,这样

  • 问题内容: 我想使用Python绘制树。决策树,组织结构图等。有什么图书馆可以帮助我呢? 问题答案: 有graphviz- http://www.graphviz.org/。它使用“ DOT”语言绘制图形。您既可以自己生成DOT代码,也可以使用pydot- https://code.google.com/p/pydot/。您还可以使用networkx- http: //networkx.lanl.

  • 我正在为一堂课做家庭作业。你必须计算这个月的工资。每次我尝试运行它时,它总是这样说:我如何修复它?线程“main”java.util.InputMismatchException中的异常 java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(扫描仪.java:1485) java.util.Scanner.ne

  • 在我当前的Spring项目中,我正在寻找一种方法来映射一个字段,就像在我的一个实体中一样: 私有地图属性; 其中键的类型应该是表示语言的双字符字符串,值的类型应该是长度约为128Kb的字符串。 这样,我就可以在数据库中存储此属性的数据: 在“选择”中,我选择一种语言并在“文本”区域中键入所选语言的文本。 在我的视图中,使用thymeleaf实现,我希望阅读与用户语言相关联的文本。 任何人都可以告诉

  • 树状图是以可视化层次表示结构的一种替代方法,同时还可以通过区域大小显示每个类别的数量。 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框 显示图表外部边框。 边界颜色 设置图表外部边框的颜色。 显示标题 显示图表的主要标题。 标题 指定图表的标题。 标题字体 设置标题的字体样式。 位置 设置标

  • 树视图以分层视图显示文档。导航栏可让你快速地切换、插入或删除文档。 添加一个文档 在导航栏点击 或按 CTRL+N 来得到一个空白显示的文档。 输入所需的数据。 在导航栏点击 来保存文档。 【注意】如果你的集合是空的,你需要点击 来添加新字段。 编辑一个文档 前往你想编辑的文档。 点击要修改的字段名、值或类型。 在导航栏点击 来应用更改。 添加一个字段或一个项目 前往你想编辑的文档。 点击 来添加