1

Java コードでは、1 秒ごとにシミュレーターから DIS パケットを収集し、KML 出力をフォーマットしようとするスレッドを生成します。私の Java コードでは、スタイルと目印とポリゴンを使用してドキュメントを作成しています。1 秒に 1 回、「マーシャル」API ルーチンが実際にデータを含む KML ファイルを作成していることがわかります。ただし、ランダムに完全なファイルを作成することもあれば、長さゼロのファイルを作成することもあります。DIS パケット ジェネレーターをオフにして Java コードを実行したままにしても、完全なファイルがランダムに作成され続け、長さ 0 のファイルが作成されることもあります。タイマーを毎秒から 10 秒ごとに変更すると、動作は 10 秒ごとに発生します。

File オブジェクトと OutputStream オブジェクトに対して marshal() を使用してみました。同じ奇妙な行動。

4

1 に答える 1

0

同時アクセスが原因である可能性があります。マーシャラーの作成は高価な操作であり、時間がかかります。私の知る限り、マーシャラーはスレッドセーフではありません。私は JAK と組み合わせて Restlet で jaxb コネクタを使用しています。これは、マーシャラーを作成してスレッドセーフな方法でキャッシュする方法の良い例です。

/** 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 に答える