2014-03-03 108 views
3

我们已经看到这个问题无数次,有人可以解释这是甚至可能的,因为BigDecimal是不可变的吗?线程挂起BigDecimal.compareTo

java.lang.Thread.State: RUNNABLE 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigInteger.<init>(Unknown Source) 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigDecimal.bigTenToThe(Unknown Source) 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigDecimal.bigDigitLength(Unknown Source) 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigDecimal.precision(Unknown Source) 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigDecimal.compareMagnitude(Unknown Source) 
2014/03/03 17:10:17.517 | INFO | jvm 1 | at java.math.BigDecimal.compareTo(Unknown Source) 

这怎么会发生?

+0

也许这个数字太大了? – nneonneo

+0

可能使用'BigInteger'的地方会加速很多。 –

+0

@ jw23 - 看起来它试图使用BigInteger - 这可能是问题所在。 –

回答

1

BigDecimal.bigTenToThe方法正在调用BigInteger构造函数。
这是它挂起的地方。请参阅源代码中的以下注释。
它很大程度上取决于你用什么参数来调用它。
另请参阅return语句。不知道你的连接
看到可变性。我在这里没有看到。

/** 
* Return 10 to the power n, as a {@code BigInteger}. 
* 
* @param n the power of ten to be returned (>=0) 
* @return a {@code BigInteger} with the value (10<sup>n</sup>) 
*/ 
private static BigInteger bigTenToThe(int n) { 
    if (n < 0) 
     return BigInteger.ZERO; 

    if (n < BIG_TEN_POWERS_TABLE_MAX) { 
     BigInteger[] pows = BIG_TEN_POWERS_TABLE; 
     if (n < pows.length) 
      return pows[n]; 
     else 
      return expandBigIntegerTenPowers(n); 
    } 
    // BigInteger.pow is slow, so make 10**n by constructing a 
    // BigInteger from a character string (still not very fast) 
    char tenpow[] = new char[n + 1]; 
    tenpow[0] = '1'; 
    for (int i = 1; i <= n; i++) 
     tenpow[i] = '0';     
    return new BigInteger(tenpow); 
} 
+0

虽然它说速度很慢,但它似乎并不是什么接近于慢的东西这将挂起线程。 –

+0

@AdrianShum我不知道。看到这个问题的主题。 –