Laotu's blog, Now Or Never, Always On The Road
阿新 • • 發佈:2019-01-23
讀程式,猜答案吧!
public class IntOut { /** 納秒->毫秒轉換 */ private static final int NANOTIME = 1000000; /** 輪詢最長毫秒: 1000ms */ private static int maxTimeOutMs = 1000; /** 輪詢最長納秒: 1000*1000000ns */ private static int maxTimeOutNs = maxTimeOutMs * NANOTIME; public static void main(String[] args) { for (int i = 8; i < 13; i++) { if ((i * maxTimeOutNs) < ((i + 1) * maxTimeOutNs)) { System.out.println(i + "<" + (i + 1)); } else { System.out.println(i + ">=" + (i + 1)); } } } }
揭密答案啦!
8<9
9<10
10>=11
11<12
12<13
為什麼會出現10>=11的情況呢?
INT型別長度溢位了。INT型別的最大長度為-2147483648~2147483647。
11*maxTimeOutNs 變成負數了。 而10*maxTimeOutNs還是正數,所以會出現10>11的情況。
那麼11>12又是什麼情況呢?大家可以輸出上面的每個值的結果看下哈。
應用場景:
一筆合併支付過來,我們會把合併支付事件拆分成一個個子訂單事件。比如買家買了五個商品,然後點選支付,買家只需要輸入一次支付密碼,即可完成這五筆訂單。在規則分析過程中,我們收到的也是一個合併支付的事件,此時我們先把合併支付事件拆分成五個子訂單事件,然後通過future方式分散式呼叫分析服務,也就是說每筆子訂單都會呼叫到其它伺服器上。我們的主伺服器等待每個子訂單事件的分析結果。在待續結果的過程中會去fetch拿結果資訊,這個地方會有個超時時間。然後我們這個超時時間期望是12S,但是由於變成了int 型別,導致變成一個負數,不等待結果便直接反回error了。