读程序,猜答案吧!
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了。