【源碼】
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。
唉,其實沒有必要在設計的時候爲以後增加太多的預期,否則可能會存在很多推翻前人思路的行爲,後人再看源碼就會很困擾。