--- jsr166/src/test/tck/RecursiveActionTest.java 2011/06/25 05:20:30 1.34 +++ jsr166/src/test/tck/RecursiveActionTest.java 2011/06/27 02:47:32 1.37 @@ -1197,33 +1197,33 @@ public class RecursiveActionTest extends testInvokeOnPool(asyncSingletonPool(), a); } + /** Demo from RecursiveAction javadoc */ static class SortTask extends RecursiveAction { final long[] array; final int lo, hi; SortTask(long[] array, int lo, int hi) { this.array = array; this.lo = lo; this.hi = hi; } - final static int THRESHOLD = 100; + SortTask(long[] array) { this(array, 0, array.length); } protected void compute() { if (hi - lo < THRESHOLD) - sequentiallySort(array, lo, hi); + sortSequentially(lo, hi); else { int mid = (lo + hi) >>> 1; invokeAll(new SortTask(array, lo, mid), new SortTask(array, mid, hi)); - merge(array, lo, mid, hi); + merge(lo, mid, hi); } } - static void sequentiallySort(long[] array, int lo, int hi) { + // implementation details follow: + final static int THRESHOLD = 100; + void sortSequentially(int lo, int hi) { Arrays.sort(array, lo, hi); } - static void merge(long[] array, int lo, int mid, int hi) { - int n = hi - lo; - long[] buf = new long[n]; - int a = lo, b = mid; - for (int i = 0; i < n; i++) - buf[i] = (b == hi || (a < mid && array[a] < array[b])) ? - array[a++] : array[b++]; - System.arraycopy(buf, 0, array, lo, n); + void merge(int lo, int mid, int hi) { + long[] buf = Arrays.copyOfRange(array, lo, mid); + for (int i = 0, j = lo, k = mid; i < buf.length; j++) + array[j] = (k == hi || buf[i] < array[k]) ? + buf[i++] : array[k++]; } } @@ -1232,12 +1232,11 @@ public class RecursiveActionTest extends */ public void testSortTaskDemo() { ThreadLocalRandom rnd = ThreadLocalRandom.current(); - long[] array = new long[1000]; + long[] array = new long[1007]; for (int i = 0; i < array.length; i++) array[i] = rnd.nextLong(); long[] arrayClone = array.clone(); - testInvokeOnPool(mainPool(), - new SortTask(array, 0, array.length)); + testInvokeOnPool(mainPool(), new SortTask(array)); Arrays.sort(arrayClone); assertTrue(Arrays.equals(array, arrayClone)); }