Java Thread How to - Do quick sort with ForkJoinPool and RecursiveAction








Question

We would like to know how to do quick sort with ForkJoinPool and RecursiveAction.

Answer

import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
/*  w  w  w .j  av  a2 s.c  o  m*/
public class Main {
  public static void main(String[] args) {
    ForkJoinPool fjPool = new ForkJoinPool();
    int[] a = new int[3333344];
    for (int i = 0; i < a.length; i++) {
      int k = (int) (Math.random() * 22222);
      a[i] = k;
    }
    ForkJoinQuicksortTask forkJoinQuicksortTask = new ForkJoinQuicksortTask(a,
        0, a.length - 1);
    long start = System.nanoTime();
    fjPool.invoke(forkJoinQuicksortTask);
    System.out.println("Time: " + (System.nanoTime() - start));
  }
}

class ForkJoinQuicksortTask extends RecursiveAction {
  int[] a;
  int left;
  int right;

  public ForkJoinQuicksortTask(int[] a) {
    this(a, 0, a.length - 1);
  }

  public ForkJoinQuicksortTask(int[] a, int left, int right) {
    this.a = a;
    this.left = left;
    this.right = right;
  }

  @Override
  protected void compute() {
    if (serialThresholdMet()) {
      Arrays.sort(a, left, right + 1);
    } else {
      int pivotIndex = partition(a, left, right);
      ForkJoinQuicksortTask t1 = new ForkJoinQuicksortTask(a, left,
          pivotIndex - 1);
      ForkJoinQuicksortTask t2 = new ForkJoinQuicksortTask(a, pivotIndex + 1,
          right);
      t1.fork();
      t2.compute();
      t1.join();
    }
  }

  int partition(int[] a, int p, int r) {
    int i = p - 1;
    int x = a[r];
    for (int j = p; j < r; j++) {
      if (a[j] < x) {
        i++;
        swap(a, i, j);
      }
    }
    i++;
    swap(a, i, r);
    return i;
  }

  void swap(int[] a, int p, int r) {
    int t = a[p];
    a[p] = a[r];
    a[r] = t;
  }

  private boolean serialThresholdMet() {
    return right - left < 100000000;
  }
}