提交 f7d94495 编写于 作者: 武汉红喜's avatar 武汉红喜

ForkJoinTest

上级 303fec88
package org.hongxi.java.util.concurrent;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.RecursiveAction;
......@@ -17,6 +19,20 @@ public class ForkJoinTest {
ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
int sum = forkJoinPool.invoke(new AccumulationTask(1, 60000));
System.out.println(sum);
long[] array = new long[10000];
Random r = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = r.nextInt(10000);
}
for (int i = 0; i < 10; i++) {
System.out.print(array[i] + " ");
}
forkJoinPool.invoke(new SortTask(array));
System.out.println();
for (int i = 0; i < 10; i++) {
System.out.print(array[i] + " ");
}
}
static class AccumulationTask extends RecursiveTask<Integer> {
......@@ -47,4 +63,44 @@ public class ForkJoinTest {
return result;
}
}
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;
}
SortTask(long[] array) {
this(array, 0, array.length);
}
protected void compute() {
if (hi - lo < THRESHOLD)
sortSequentially(lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(lo, mid, hi);
}
}
// implementation details follow:
static final int THRESHOLD = 1000;
void sortSequentially(int lo, int hi) {
Arrays.sort(array, lo, hi);
}
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++];
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册