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

时间:2013-03-25 12:35:36

标签: java scheduled-tasks nanotime time-precision

在我的公司,我有一个程序必须通过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)然后在执行send(..)之前等到“currentNanoTime - lastNanoTime> 7981859”?

我的问题是我找不到等待纳秒的方法,只需几毫秒。

1 个答案:

答案 0 :(得分:1)

我无法帮助您认为这不切实际。

不考虑Java 实时环境(运行不同的线程,执行垃圾收集等)这一事实,您能保证您的UDP数据包能够以规定的精度到达吗?无法保证UDP传送,更不用说具有任何QoS(服务质量)概念