ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
(Generate patch)

Comparing jsr166/src/test/tck/RecursiveActionTest.java (file contents):
Revision 1.33 by jsr166, Fri Jun 24 18:49:56 2011 UTC vs.
Revision 1.34 by jsr166, Sat Jun 25 05:20:30 2011 UTC

# Line 12 | Line 12 | import java.util.concurrent.ForkJoinPool
12   import java.util.concurrent.ForkJoinTask;
13   import java.util.concurrent.ForkJoinWorkerThread;
14   import java.util.concurrent.RecursiveAction;
15 + import java.util.concurrent.ThreadLocalRandom;
16   import java.util.concurrent.TimeUnit;
17   import java.util.concurrent.TimeoutException;
18   import static java.util.concurrent.TimeUnit.SECONDS;
19 + import java.util.Arrays;
20   import java.util.HashSet;
21  
22   public class RecursiveActionTest extends JSR166TestCase {
# Line 1195 | Line 1197 | public class RecursiveActionTest extends
1197          testInvokeOnPool(asyncSingletonPool(), a);
1198      }
1199  
1200 +    static class SortTask extends RecursiveAction {
1201 +        final long[] array; final int lo, hi;
1202 +        SortTask(long[] array, int lo, int hi) {
1203 +            this.array = array; this.lo = lo; this.hi = hi;
1204 +        }
1205 +        final static int THRESHOLD = 100;
1206 +        protected void compute() {
1207 +            if (hi - lo < THRESHOLD)
1208 +                sequentiallySort(array, lo, hi);
1209 +            else {
1210 +                int mid = (lo + hi) >>> 1;
1211 +                invokeAll(new SortTask(array, lo, mid),
1212 +                          new SortTask(array, mid, hi));
1213 +                merge(array, lo, mid, hi);
1214 +            }
1215 +        }
1216 +        static void sequentiallySort(long[] array, int lo, int hi) {
1217 +            Arrays.sort(array, lo, hi);
1218 +        }
1219 +        static void merge(long[] array, int lo, int mid, int hi) {
1220 +            int n = hi - lo;
1221 +            long[] buf = new long[n];
1222 +            int a = lo, b = mid;
1223 +            for (int i = 0; i < n; i++)
1224 +                buf[i] = (b == hi || (a < mid && array[a] < array[b])) ?
1225 +                    array[a++] : array[b++];
1226 +            System.arraycopy(buf, 0, array, lo, n);
1227 +        }
1228 +    }
1229 +
1230 +    /**
1231 +     * SortTask demo works as advertised
1232 +     */
1233 +    public void testSortTaskDemo() {
1234 +        ThreadLocalRandom rnd = ThreadLocalRandom.current();
1235 +        long[] array = new long[1000];
1236 +        for (int i = 0; i < array.length; i++)
1237 +            array[i] = rnd.nextLong();
1238 +        long[] arrayClone = array.clone();
1239 +        testInvokeOnPool(mainPool(),
1240 +                         new SortTask(array, 0, array.length));
1241 +        Arrays.sort(arrayClone);
1242 +        assertTrue(Arrays.equals(array, arrayClone));
1243 +    }
1244   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines