在Java代码中,我生成一个Thread,它每秒从模拟器收集DIS数据包,尝试格式化KML输出。在我的Java代码中,我正在创建一个包含样式,地标和多边形的文档。每隔一秒我就可以看到“marshal”API例程确实用我的数据创建了一个KML文件。但是,随机有时会创建一个完整的文件,有时它会创建一个零长度文件。即使我关闭DIS数据包生成器并让我的Java代码仍然运行,它仍继续随机创建一个完整的文件,有时会创建一个零长度文件。当我将计时器从每秒更改为每10秒时,行为每10秒发生一次。
我尝试将marshal()用于File对象和OutputStream对象;同样奇怪的行为。
答案 0 :(得分:0)
这可能是由于并发访问。创建一个marshaller是一项昂贵的操作,需要时间,据我所知,marshallers不是线程安全的。我在Restlet中使用jaxb连接器,加上JAK,这是一个good example关于如何创建marshallers并以线程安全的方式缓存它们:
/** Use thread identity to preserve safety of access to marshalers. */
private final ThreadLocal<javax.xml.bind.Marshaller> marshaller = new ThreadLocal<javax.xml.bind.Marshaller>() {
查看marshaller如何在synchronized方法中创建,然后存储在ThreadLocal变量中。