[英]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.