У меня есть этот класс, который распространяется RecursiveAction
. тот же класс содержит конструктор, который принимает массив как аргумент и метод compute()
. Внутри метода вычисления, он говорит следующее: если array
длина больше 500, разделите этот массив на две половины и отсортируйте их по методу MergeSort.merge()
. если длина массива меньше 500, просто соберите array
.Параллельное программирование. compute(), java
private static class SortTask extends RecursiveAction {
private final int THRESHOLD = 500;
private int[] list;
SortTask(int[] list) {
this.list = list;
}
@Override
protected void compute() {
if (list.length < THRESHOLD)
java.util.Arrays.sort(list);
else {
// Obtain the first half
int[] firstHalf = new int[list.length/2];
System.arraycopy(list, 0, firstHalf, 0, list.length/2);
// Obtain the second half
int secondHalfLength = list.length - list.length/2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list, list.length/2,
secondHalf, 0, secondHalfLength);
// Recursively sort the two halves
invokeAll(new SortTask(firstHalf),
new SortTask(secondHalf));
// Merge firstHalf with secondHalf into list
MergeSort.merge(firstHalf, secondHalf, list);
}
}
}
}
Это говорит «рекурсивно сортирует две половинки» и он делает это с помощью:
invokeAll(new SortTask(firstHalf), new SortTask(secondHalf));
это означает, что каждый раз, когда new
SortTask
создается объект, compute()
вызывается метод?
Если список под THRESHOLD не создается, добавляется дополнительная SortTask. В противном случае создается по меньшей мере дополнительное число пар (2, 4, 6, 8 ...) SortTask. –