2012-09-04 102 views
1

在Java代码,我产生一个线程,其每秒从模拟器集DIS包,并且尝试 KML格式输出。在我的Java代码中,我创建了一个带有样式和地标和多边形的文档。每隔一秒我都会看到“marshal”API例程确实会用我的数据创建一个KML文件。然而,随机有时它创建一个完整的文件,有时它创建一个零长度文件。甚至当我把我的DIS包发生器断开,并留下我的Java代码仍然在运行,它会继续随机创建一个完整的文件,有时会造成零长度文件。当我每秒钟更改我的计时器到每10秒时,行为每10秒发生一次。KML编组产生零长度文件

我尝试使用编组()到一个文件对象,并且到OutputStream对象;同样奇怪的行为。

回答

0

这可能是由于并发访问。创建一个编组是一个昂贵的操作,需要时间,据我所知编组不是线程安全的。我使用的Restlet JAXB的连接器,加上JAK,这是关于如何创建marshallers并以线程方式缓存他们good example

/** Use thread identity to preserve safety of access to marshalers. */ 
private final ThreadLocal<javax.xml.bind.Marshaller> marshaller = new ThreadLocal<javax.xml.bind.Marshaller>() { 

看到有编组是如何在一个同步的方法创建,然后存储在一个ThreadLocal变量中。