• java wait(long timeout, int nanos),后面的nanos有什么用?


    【源码】

    java1.8:

     1 public final void wait(long timeout, int nanos) throws InterruptedException {
     2     if (timeout < 0) {
     3         throw new IllegalArgumentException("timeout value is negative");
     4     }
     5 
     6     if (nanos < 0 || nanos > 999999) {
     7         throw new IllegalArgumentException(
     8                             "nanosecond timeout value out of range");
     9     }
    10 
    11     if (nanos > 0) {
    12         timeout++;
    13     }
    14 
    15     wait(timeout);
    16 }

    更早期一些的版本:

     1 public final void wait(long timeout, int nanos) throws nterruptedException {
     2     if (timeout < 0) {
     3         throw new IllegalArgumentException("timeout value is negative");
     4     }
     5     // nanos 单位为纳秒,  1毫秒 = 1000 微秒 = 1000 000 纳秒
     6     if (nanos < 0 || nanos > 999999) {
     7         throw new IllegalArgumentException(
     8                 "nanosecond timeout value out of range");
     9     }
    10 
    11     // nanos 大于 500000 即半毫秒  就timout 加1毫秒
    12     // 特殊情况下: 如果timeout为0且nanos大于0,则timout加1毫秒
    13     if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
    14         timeout++;
    15     }
    16 
    17     wait(timeout);
    18 }

    【官方解释】

    参数timeout的单位为毫秒, 参数nanos 的单位为纳秒, 1毫秒 = 1000 微秒 = 1000 000 纳秒。

    处理时,由于纳秒级时间太短, 所以对参数nanos 其采取了近似处理,

    • 原先的时候大于半毫秒的加1毫秒,小于1毫秒则舍弃(特殊情况下,参数timeout0,参数nanos大于0,也算为1毫秒);
    • 现在则是直接加1毫秒。

      其主要作用应该在能更精确控制等待时间(尤其在高并发时,毫秒的时间节省也是很值得的)

       

    【思考】

    仅仅是加了1ms,其实是毫无意义的。

    猜测应该是原先的时候,需要在高并发的情况下,严格控制等待时间,但是当时限于技术优先,将其放进了TODO中,通过简单的方法先暂时留存在jdk中。

    但是到了jdk后期版本,发现这个nanos其实毫无意义,但是为了兼容之前的版本,直接粗暴加1

       

    唉,其实没有必要在设计的时候为以后增加太多的预期,否则可能会存在很多推翻前人思路的行为,后人再看源码就会很困扰。

  • 相关阅读:
    centos5.8下用shell脚本监控服务器
    linux下IPTABLES配置详解
    centos设置计划任务(cron)
    32位CentOS系统安装kernel-PAE支持4g以上内存
    Excel同时打开多个独立的窗口
    yum安装LAMP
    多字段指定不同方向排序
    MySQL基础
    Python 网络编程
    Python 并发编程
  • 原文地址:https://www.cnblogs.com/liufarui/p/15953274.html
Copyright © 2020-2023  润新知