极度精确的重复/连续代码执行



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

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

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

此刻,我们通过

发送udp - packet。
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(..) ?

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

我忍不住认为这是不现实的。

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

最新更新