0

在我的公司,我有一个程序必须通过 UDP 将一些数据发送到不受我们控制的远程系统。

数据必须每 7981859ns (=7.98 毫秒) +/- 0.001ms 发送一次。

可悲的是,如果我们传输数据太晚,旧版本的远程系统就会崩溃,如果我们传输太快/太早(实时数据生成),我们这边的数据就会用完。

目前,我们正在通过

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);

如果我添加一些日志记录,我可以看到数据在 6ms - 11ms 之间发送,这对我们来说范围太大了。

我现在想知道如何优化它。

是否可以使用上次传输的纳米时间戳设置变量(如何获得?我只知道System.currentTimeMillis()),更快地执行循环(或只是在循环中while(true)),然后等到“currentNanoTime - lastNanoTime > 7981859 “在做之前send(..)

我的问题是我没有找到等待纳秒的方法,只有几毫秒。

4

1 回答 1

1

我不禁想到这不切实际。

撇开 Java不是实时环境(运行不同的线程、执行垃圾收集等)这一事实不谈,您能否保证您的 UDP 数据包能够以规定的精度到达?UDP 交付没有保证,更不用说有任何 QoS(服务质量)的概念

于 2013-03-25T12:37:37.700 回答