0

私の会社では、UDP を介して、私たちの管理下にないリモート システムにデータを送信する必要があるプログラムがあります。

データは7981859ns (=7.98 ミリ秒) +/- 0.001ms ごとに送信する必要があります。

悲しいことに、データを送信するのが遅すぎると、そのリモート システムの古いバージョンが機能しなくなります。また、送信が速すぎたり早すぎたりすると、データが不足します (リアルタイム データ生成)。

現時点では、UDP パケットを次の方法で送信しています。

private Runnable sendData() {
    return new Runnable() {
        byte[] b = new byte[2000];
        DatagramPacket packet = new DatagramPacket(b, b.length);

        public void run() {
                // do some processing and fill the DatagramPacket
                // (..)
                packet.setData(data);   
                packet.setSocketAddress(address);
                socket.send(packet);
                Log.debug("log time here")
        }
    };
}

threadPoolExecutor = new ScheduledThreadPoolExecutor(3);
threadPoolExecutor.scheduleAtFixedRate(sendData(), 7981859, 7981859, TimeUnit.NANOSECONDS);

ログを追加すると、データが 6 ミリ秒から 11 ミリ秒の間に送信されていることがわかります。これは、私たちにとっては大きすぎる範囲です。

これを最適化する方法を考えました。

最後の送信のナノタイムスタンプで変数を設定することは可能でしょうか (どのようにそれを取得しますか?私は知っています。System.currentTimeMillis())ループを少し速く実行し (または単にループでwhile(true))、「currentNanoTime - lastNanoTime > 7981859」まで待ちます)。send(..)?を実行する前に

私の問題は、ナノ秒、ミリ秒だけ待つ方法が見つからなかったことです。

4

1 に答える 1

1

これは実用的ではないと思わずにはいられません。

Java がリアルタイム環境ではないという事実 (さまざまなスレッドの実行、ガベージ コレクションの実行など) は別として、UDP パケットが指定された精度で到着できることを保証できますか? UDP 配信は保証されず、ましてや QoS (サービス品質) の概念はありません

于 2013-03-25T12:37:37.700 に答える