所用较少,就不再分析太多了
ForkJoin框架使用
public class LongSum extends RecursiveTask<Long> { static final int SEQUENTIAL_THRESHOLD = 1000; int low; int high; int[] array; LongSum(int[] arr, int lo, int hi) { array = arr; low = lo; high = hi; } /** * fork()方法:将任务放入队列并安排异步执行,一个任务应该只调用一次fork()函数,除非已经执行完毕并重新初始化。 * tryUnfork()方法:尝试把任务从队列中拿出单独处理,但不一定成功。 * join()方法:等待计算完成并返回计算结果。 * isCompletedAbnormally()方法:用于判断任务计算是否发生异常。 */ protected Long compute() { if (high - low <= SEQUENTIAL_THRESHOLD) { long sum = 0; for (int i = low; i < high; ++i) { sum += array[i]; } return sum; } else { int mid = low + (high - low) / 2; LongSum left = new LongSum(array, low, mid); LongSum right = new LongSum(array, mid, high); left.fork(); right.fork(); long rightAns = right.join(); long leftAns = left.join(); return leftAns + rightAns; } } }
public class LongSumMain { //获取逻辑处理器数量 static final int NCPU = Runtime.getRuntime().availableProcessors(); public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); int[] array = new int[20000000]; Random random = new Random(); for (int i = 0; i < 20000000; i++) { array[i] = random.nextInt(100); } //采用fork/join方式将数组求和任务进行拆分执行,最后合并结果 LongSum longSum = new LongSum(array, 0, array.length); ForkJoinPool forkJoinPool = new ForkJoinPool(NCPU); //使用的线程数 ForkJoinTask<Long> task = forkJoinPool.submit(longSum); System.out.println("forkjoin sum=" + task.get()); if(task.isCompletedAbnormally()){ System.out.println(task.getException().toString()); } forkJoinPool.shutdown(); } }