import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.*;
class SortTask extends RecursiveAction {
final int[] array;
final int left;
final int right;
private int THRESHOLD = 10000; // 设置序列长度为THRESHOLD时不再新开线程
public SortTask(int[] array) {
this.array = array;
this.left = 0;
this.right = array.length - 1;
}
public SortTask(int[] array, int left, int right) {
this.array = array;
this.left = left;
this.right = right;
}
protected void compute() {
if (right - left < THRESHOLD)
sequentiallySort(array, left, right);
else {
int pivot = partition(array, left, right);
new SortTask(array, left, pivot - 1).fork();
new SortTask(array, pivot + 1, right).fork();
}
}
private int partition(int[] array, int left, int right) {
int x = array[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (array[j] <= x) {
i++;
swap(array, i, j);
}
}
swap(array, i + 1, right);
return i + 1;
}
private void swap(int[] array, int i, int j) {
if (i != j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
private void sequentiallySort(int[] array, int left, int right) {
Arrays.sort(array, left, right + 1);
}
}
public class Main{
private static final int NARRAY = 1000000; //10000w 随机生成序列的长度
int[] array = new int[NARRAY];
Random rand = new Random();
public void setUp() {
for (int i = 0; i < array.length; i++) {
array[i] = rand.nextInt(10000000);
}
//System.out.println("Initial Array: " + Arrays.toString(array));
}
boolean checkSorted(int[] a) {
//System.out.println("End Array: " + Arrays.toString(a));
for (int i = 0; i < a.length - 1; i++) {
if (a[i] > (a[i + 1])) return false;
}
return true;
}
public static void main(String[] args) throws Exception{
Main sample = new Main();
//////////////////////////////////////////////////////////////
sample.setUp();
long startTime = System.currentTimeMillis(); //获取开始时间
Arrays.sort(sample.array,0,sample.array.length);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("单线程快排总用时"+String.valueOf(endTime-startTime)+"ms");
if( sample.checkSorted(sample.array) ) System.out.println("wright sort.");
///////////////////////////////////////////////////////////////
sample.setUp();
startTime=System.currentTimeMillis(); //获取开始时间
ForkJoinTask sort = new SortTask(sample.array);
ForkJoinPool fjpool = new ForkJoinPool();
fjpool.submit(sort);
fjpool.shutdown();
fjpool.awaitTermination(30, TimeUnit.SECONDS);
endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("多线程快排总用时"+String.valueOf(endTime-startTime)+"ms");
if( sample.checkSorted(sample.array) ) System.out.println("wright sort.");
}
}
ForkJoinPool java1.7 多线程快排
最新推荐文章于 2021-02-27 23:33:00 发布