在我的公司,我有一个程序必须通过 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(..)
?
我的问题是我没有找到等待纳秒的方法,只有几毫秒。