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 { |
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 |
|
} |