From f7d944952877815c3278ec30186719a001334cb4 Mon Sep 17 00:00:00 2001 From: javahongxi Date: Sun, 11 Aug 2019 23:38:20 +0800 Subject: [PATCH] ForkJoinTest --- .../java/util/concurrent/ForkJoinTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java index 910604cb..23f414a7 100644 --- a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java +++ b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ForkJoinTest.java @@ -1,5 +1,7 @@ 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 { @@ -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++]; + } + } } -- GitLab