gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:44:14 26 4
gpt4 key购买 nike

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

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

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

目前,我们正在通过以下方式发送 UDP 数据包

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(服务质量)的概念了

关于java - 极其精确的重复/连续代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com