//尚未研究完成...
package org.bluebear.temp;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit;
/**
* RecursiveAction里面只有一个compute抽象方法。
*
*
*/
public class SortTask extends RecursiveAction {
private static final long serialVersionUID = -4706085992307767517L;
final long[] array;
final int lo;
final int hi;
private int THRESHOLD = 30;
public SortTask(long[] array) {
this(array, 0, array.length - 1);
}
public SortTask(long[] array, int lo, int hi) {
this.array = array;
this.lo = lo;
this.hi = hi;
}
@Override
protected void compute() {
if (hi - lo < THRESHOLD) {
sequentiallySort(array, lo, hi);
} else {
int pivot = partition(array, lo, hi);
this.invokeAll(new SortTask(array, lo, pivot - 1), new SortTask(
array, pivot + 1, hi));
}
}
private int partition(long[] array, int lo, int hi) {
long x = array[hi];
int i = lo - 1;
for (int j = lo; j < hi; j++) {
if (array[j] <= x) {
i++;
swap(array, i, j);
}
}
swap(array, i + 1, hi);
return i + 1;
}
private void swap(long[] array, int i, int j) {
if (i != j) {
long temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
private void sequentiallySort(long[] array, int lo, int hi) {
Arrays.sort(array, lo, hi + 1);
}
public static void main(String[] args) throws Exception {
long[] array = new long[100];
Random random = new Random();
for(int i=0;i<100;i++){
array[i] = random.nextInt(1000);
}
ForkJoinTask sort = new SortTask(array);
ForkJoinPool pool = new ForkJoinPool();
pool.submit(sort);
pool.shutdown();
pool.awaitTermination(30, TimeUnit.SECONDS);
for(int i=0;i<array.length;i++){
System.out.print(array[i] + " , ");
}
}
}
参考:
http://www.deftitlenil.com/2011/04/blog-post_05.html
http://www.ibm.com/developerworks/cn/java/j-lo-forkjoin/
http://drdobbs.com/blogs/jvm/231000556