簡體   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