繁体   English   中英

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

[英]Extreme precise repeated/continuous code-execution

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

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

可悲的是,如果我们太迟地传输数据,那么该远程系统的旧版本将会崩溃,而如果我们传输得太早/太早(实时数据生成),则我们的一方将耗尽数据。

目前,我们正在通过以下方式发送UDP-paket

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) -loop中)然后等到“ currentNanoTime-lastNanoTime> 7981859”再执行send(..)

我的问题是我没有找到等待毫秒(仅毫秒)的方法。

我不禁认为这将不切实际。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM