Java 中有比较精确的微秒级别的延迟方法吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NeoZephyr
V2EX    Java

Java 中有比较精确的微秒级别的延迟方法吗

  •  
  •   NeoZephyr 2022-07-21 17:42:25 +08:00 3796 次点击
    这是一个创建于 1258 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看了一下,c 里面有 struct timeval 结构体,时间可以精确到微秒,而且使用 select 会比 sleep 更好

    但是,在 java 里面,最多才到毫秒级别,而且 sleep 的方式,也容易出现误差

    不知道是否有其他方式实现,比较准确的延迟

    22 条回复    2022-07-26 08:30:53 +08:00
    wombat
        1
    wombat  
       2022-07-21 18:00:20 +08:00
    就算 sleep 了那么微秒,可能 cpu 调度执行的时候,是延迟的吧。
    mawerss1
        2
    mawerss1  
       2022-07-21 18:06:12 +08:00
    不说 java ,操作系统级别也没有吧
    feather12315
        3
    feather12315  
       2022-07-21 18:11:56 +08:00 via Android   1
    @mawerss1 #2 OS 都有纳秒级别的延迟手段
    mxalbert1996
        4
    mxalbert1996  
       2022-07-21 18:17:07 +08:00 via Android   5
    如果你需要精确到微妙级的对时间的掌控,那你根本就不应该用 Java 这种带 GC 的语言。
    v2eb
        5
    v2eb  
       2022-07-21 18:20:28 +08:00 via Android
    开发什么功能
    lzfnb
        6
    lzfnb  
       2022-07-21 18:27:36 +08:00
    LockSupport.parkNanos() ?
    reid567
        7
    reid567  
       2022-07-21 18:33:59 +08:00
    TimeUnit.MICROSECONDS.sleep(); 这种吗?
    NeoZephyr
        8
    NeoZephyr  
    OP
       2022-07-21 18:37:23 +08:00
    @jiajianjava 好像不行,里面还是 Thread.sleep
    NeoZephyr
        9
    NeoZephyr  
    OP
       2022-07-21 18:39:19 +08:00
    @v2eb 延时消息、事件的功能
    LeeReamond
        10
    LeeReamond  
       2022-07-21 18:50:50 +08:00 via Android
    @mxalbert1996 零度要求也分级别的,要求微秒也未必 100%场景都要微秒。常见场景比如统计一秒内能做 xxx 事之类的,统计过程中基本准确即可,不需要服务级稳定
    elfive
        11
    elfive  
       2022-07-21 18:51:22 +08:00 via iPhone
    Windows C++延时器,精度没有到 us ,不是 RTOS ,不可能有这种精度。
    用多媒体计时器做成的延时器也只能最好到 1ms 精度。
    newmlp
        12
    newmlp  
       2022-07-21 19:31:55 +08:00
    没有
    jptx
        13
    jptx  
       2022-07-21 19:34:14 +08:00
    好奇到底是什么样的场景,需要 Java 来实现而且需要延迟精确到微秒,应该有别的解决方案
    mxalbert1996
        14
    mxalbert1996  
       2022-07-21 19:46:56 +08:00 via Android
    @LeeReamond 如果只是要计时的话当然没问题,Java 里也有 System.nanoTime(),但楼主要的是延迟,也就是我所说的「对时间的控制」。
    NeoZephyr
        15
    NeoZephyr  
    OP
       2022-07-21 19:50:38 +08:00
    @jptx 我的场景只需要到秒就可以了。我只是突然看到有关时间轮的实现,发现 java 里面延迟都是毫秒级别的,好奇问下大家
    nothingistrue
        16
    nothingistrue  
       2022-07-22 09:42:23 +08:00
    我是没发现 JDK 有精确控制时钟(基于精确时钟触发操作,不是获取精确时钟刻度)的 API ,考虑到 Java 运行在 JVM 而不是 OS 上,JDK 要没这 API ,第三方框架也做不了。

    时间轮那个,原本就不是精确延迟时间,其实毫秒级别都已经过了,大量任务跑起来,误差都是上分钟级别的。选择毫秒那是因为在不用时钟的情况下 Java 能读取的时间刻度的单位最低就到毫秒。
    NeoZephyr
        17
    NeoZephyr  
    OP
       2022-07-22 10:43:44 +08:00
    @nothingistrue

    时间轮误差这么大吗?那 linux 自己的时间轮,不是也有问题吗,感觉不太可能吧。

    如果 java 延迟误差那么大的话,那一些中间件提供的延迟队列,不也有问题吗?误差到分钟级别,怎么也接受不了啊
    muyiluop
        18
    muyiluop  
       2022-07-22 12:24:31 +08:00
    时间轮肯定是有误差的,你想想同一个时刻要执行的任务越多不就需要越长时间么,你也不可能做到让所有任务都同时执行
    nothingistrue
        19
    nothingistrue  
       2022-07-22 12:42:16 +08:00   1
    @NeoZephyr 先拿 Thread.sleep 来说,sleep 100 毫秒,只是告诉线程调度者要休眠 100 毫秒,但线程调度者并不会严格按照 100 毫秒去休眠,而是首先照顾自身的调度机制,这样就会产生误差。在线程调度级别,这个误差很小,几乎可以忽略。到了时间轮上,误差也是这么来的,误差的大小取决于时间轮的调度配置。配的调度间隔小,误差就小,但轮询消耗高。配置的调度间隔大,误差就大,但轮询消耗小。

    时间轮的误差大不大,取决于怎么配置,linux 的是操作系统级别任务,配的误差就小。对于现实业务,误差是允许很多大的,比如说“一天后自动退款”,你给误差 1 小时甚至 12 小时都允许。这时候就可以照顾性能,给时间轮配置大的调度间隔。
    Chinsung
        20
    Chinsung  
       2022-07-22 17:41:25 +08:00
    Java 级别很难实现吧,如果发生 gc stw 了呢?微妙级别很难准确
    goalidea
        21
    goalidea  
       2022-07-24 09:48:12 +08:00
    jni
    mmdsun
        22
    mmdsun  
       2022-07-26 08:30:53 +08:00 via iPhone   1
    有关系统时间误差,可以参考:
    https://docs.microsoft.com/zh-cn/windows/win32/sysinfo/acquiring-high-resolution-time-stamps#low-level-hardware-clock-characteristics

    简单的 Win 上任务管理器右键,就能把程序进程设置成实时的。普通 Win 系统可以做到软实时。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4880 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:33 PVG 16:33 LAX 00:33 JFK 03:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86