Поток печатает результаты после завершения метода Main - PullRequest
0 голосов
/ 13 апреля 2020

Окончательный результат моих вычислений равен 0, но когда я печатаю результат в моем методе run(), правильный результат появляется после завершения моего метода main. Кто-нибудь знает, почему это происходит?

    @Override
public void run() {

    BigDecimal counter = BigDecimal.ZERO;
    BigDecimal numOfAllThreadsBigDecimal = new BigDecimal(getNumOfAllThreads());
    BigDecimal numOfThreadBigDecimal = new BigDecimal(getNumOfThread());
    BigDecimal numerator = BigDecimal.ZERO;
    BigDecimal divisor = BigDecimal.ZERO;
    BigDecimal endResult = BigDecimal.ZERO;

    while (!isFlag()) {
        // counter % numOfAllThreads == numOfThread
        if (counter.remainder(numOfAllThreadsBigDecimal).equals(numOfThreadBigDecimal)) {
            // (4 * counter)! * (1103 + 26390 * counter)
            numerator = BigDecimalFactorial.factorial((counter.multiply(new BigDecimal(4)))).multiply(new BigDecimal(1103).add((new BigDecimal(26390).multiply(counter))));
            // (counter!)^4 * 396^4*counter
            divisor =  ((BigDecimalFactorial.factorial(counter)).pow(4)).multiply( (new BigDecimal(396).pow(4 * counter.intValue())) ) ;
            // numerator / divisor
            endResult = endResult.add(((numerator.divide(divisor, 100, RoundingMode.HALF_UP))));

            internalSteps++;

        }
        counter = counter.add(BigDecimal.ONE);
    }
    // multiply endResult by sqrt(8) / 9801
    endResult = endResult.multiply(((BigDecimalSqrt.bigSqrt(new BigDecimal(8))).divide(new BigDecimal(9801),100,RoundingMode.HALF_UP)));
    // divide 1 / pi
    endResult = BigDecimal.ONE.divide(endResult, 100, RoundingMode.HALF_UP);

    System.out.println(endResult);

    setThreadResult(endResult);
}


    public BigDecimal getValue() {

    BigDecimal result = BigDecimal.ZERO;

    for(Ramanujan worker : workers)
        result = result.add(worker.getThreadResult());
    this.value = result;

    return this.value;
}


    public static void main(String[] args) {

    CalculatePi pi = new Ramanujan();

    pi.startCalculation();
    long timeStart = System.currentTimeMillis();

    int i = 0;
    while(i < MAX_PRECISION) {
        someDelay();
        i++;
    }
    long timeStop = System.currentTimeMillis();
    pi.stopCalculation();
    System.out.println((timeStop - timeStart) + " ms");
    System.out.println("Result: " + pi.getValue());
    System.out.println("IternalSteps: " + pi.getInternalSteps());

}

Результат на консоли:

10004 ms (that's correct) 
Result: 0
InternalSteps: 2088
3.141592653589793...

Номер 3.141592653589793 должен появиться в строке результатов.

1 Ответ

1 голос
/ 13 апреля 2020

Когда вы запускаете поток, он работает параллельно с потоком main. Если вы хотите остановить выполнение потока main до тех пор, пока другой поток не завершит свою работу, существует несколько подходов, но самый простой из них - использование метода join. для дальнейшей информации читайте java документацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...