2014-03-03 158 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我不知道。看到這個問題的主題。 –