1

在 Java 代码中,我生成了一个线程,它每秒从模拟器收集 DIS 数据包,并尝试格式化 KML 输出。在我的 Java 代码中,我正在创建一个带有样式、地标和多边形的文档。每秒一次,我可以看到“marshal”API 例程确实使用我的数据创建了一个 KML 文件。但是,有时它会随机创建一个完整的文件,有时它会创建一个零长度文件。即使我关闭了我的 DIS 数据包生成器,并让我的 Java 代码仍在运行,它仍然会继续随机创建一个完整的文件,有时还会创建一个零长度的文件。当我将计时器从每秒更改为每 10 秒时,行为每 10 秒发生一次。

我尝试将 marshal() 用于 File 对象和 OutputStream 对象;同样奇怪的行为。

4

1 回答 1

0

这可能是由于并发访问。创建编组器是一项昂贵的操作,它需要时间,而且据我所知编组器不是线程安全的。我在 Restlet 中使用了 jaxb 连接器,并结合了 JAK,这是一个很好的例子,说明了如何创建编组器并以线程安全的方式缓存它们:

/** 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 变量中。

于 2012-09-05T01:45:17.927 回答