java wait(long timeout, int nanos),后面的nanos有什么用?
2022/3/2 1:51:24
本文主要是介绍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毫秒则舍弃(特殊情况下,参数timeout为0时,参数nanos大于0时,也算为1毫秒);
- 现在则是直接加1毫秒。
其主要作用应该在能更精确控制等待时间(尤其在高并发时,毫秒的时间节省也是很值得的)。
【思考】
仅仅是加了1ms,其实是毫无意义的。
猜测应该是原先的时候,需要在高并发的情况下,严格控制等待时间,但是当时限于技术优先,将其放进了TODO中,通过简单的方法先暂时留存在jdk中。
但是到了jdk后期版本,发现这个nanos其实毫无意义,但是为了兼容之前的版本,直接粗暴加1。
唉,其实没有必要在设计的时候为以后增加太多的预期,否则可能会存在很多推翻前人思路的行为,后人再看源码就会很困扰。
这篇关于java wait(long timeout, int nanos),后面的nanos有什么用?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南