私はこのクラスを拡張してRecursiveAction
としています。 同じクラスには、配列を引数とするコンストラクタと、compute()
メソッドが含まれています。 計算方法の中では、次のようになります。の長さが500より大きい場合は、その配列を2つの半分に分割し、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は作成されません。それ以外の場合は、少なくともSortTaskの追加のペア番号(2,4,6,8 ...)が作成されます。 –