Нахождение самого большого числа с помощью ForkJoin

Без блока if delay == 2 работает, а с ним не работает.

Вот расчет ForkJoin:

compute() {

    if(lastElem - firstElem == 1)
        return array[firstElem];

    if(lastElem - firstElem == 2){

        if(array[firstElem] > array[lastElem])
            return array[firstElem];
        else
            return array[lastElem];
    }

    int midElem = (firstElem + lastElem) / 2;

    MyForkJoinTask left = new MyForkJoinTask(array, firstElem, midElem);
    MyForkJoinTask right = new MyForkJoinTask(array, midElem, lastElem);

    left.fork();
    right.fork();

    int leftResult = left.join();
    int rightResult = right.join();

    if(leftResult > rightResult)
        return leftResult;
    else
        return rightResult;


}

Вот мой основной метод:

main(String[] args) {
    Random r = new Random();
    for(int i = 0; i < array.length; i++){
        array[i] = r.nextInt();
    }
    MyForkJoinTask root = new MyForkJoinTask(array);
    F_J_POOL.submit(root);
    System.out.println("Result is " + root.join());
}

Короткая ошибка:

Исключение в потоке "основной" java.lang.ArrayIndexOutOfBoundsException

at com.bg.fork_join.MainFJ.main(MainFJ.java:24) Вызвано: java.lang.ArrayIndexOutOfBoundsException ... еще 15

Вызвано: java.lang.ArrayIndexOutOfBoundsException: 10000 в com.bg.fork_join.MyForkJoinTask.compute(MyForkJoinTask.java:31)

Не могли бы вы показать мне, где проблема?


person dddkk    schedule 04.04.2014    source источник
comment
строка 31? MyForkJoinTask.java   -  person Marco Acierno    schedule 04.04.2014
comment
Я изменил форматирование вашего кода, добавил отсутствующие объявления возвращаемого типа и объявления полей. Кроме того, в StackOverflow вы обычно не меняете заголовок на ... можно закрыть — вы можете заархивировать закрытие вопроса, пометив его (флаг находится прямо под тегами); вопросы в первую очередь закрываются, потому что есть СПАМ или другой неприемлемый контент. Это сделано для того, чтобы можно было добавить еще лучшие ответы. Так что счастливое кодирование, ваша проблема была решена :)   -  person TheConstructor    schedule 04.04.2014
comment
@TheConstructor, вы не должны закрывать спам. Вы должны пометить его для удаления.   -  person John Dvorak    schedule 04.04.2014
comment
@JanDvorak, ты прав. Тем не менее, оба они начинаются с флага ;-) Пытался не допустить взрыва комментария.   -  person TheConstructor    schedule 04.04.2014
comment
@TheConstructor - вопросы следует закрывать только в том случае, если они неуместны для сайта (не по теме, плохо описаны и т. д.), а не тогда, когда задавший вопрос получает ответ. Пожалуйста, не предлагайте людям помечать это, так как мы отклоним эти пометки.   -  person Brad Larson    schedule 04.04.2014
comment
@BradLarson Я не предлагал помечать это для закрытия. Я просто пытался объяснить, что вы только что сказали, и почему вы даже тогда не отредактировали заголовок.   -  person TheConstructor    schedule 04.04.2014


Ответы (1)


Я ничего не знаю о ForkJoin, но это выглядит подозрительно только в общих чертах:

if(lastElem - firstElem == 2){

    if(array[firstElem] > array[lastElem])
        return array[firstElem];
    else
        return array[lastElem];
}

Остальная часть вашего кода создает впечатление, что вы обрабатываете подмассив от firstElem (включительно) до lastElem (исключительно), поэтому не следует ли вам использовать lastElem-1 для индексации?

person ajb    schedule 04.04.2014