私の会社では、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(..)
?を実行する前に
私の問題は、ナノ秒、ミリ秒だけ待つ方法が見つからなかったことです。