1. 程式人生 > >Laotu's blog, Now Or Never, Always On The Road

Laotu's blog, Now Or Never, Always On The Road

讀程式,猜答案吧!

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了。