Java Fork-Join框架实现并发查找

xiaoxiao2021-02-28  144

import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class ForkJoinTest { public static void main(String[] args) { // TODO Auto-generated method stub final int SIZE = 10; Double[] nums = new Double[SIZE]; for (int i = 0; i < SIZE; ++i) { nums[i] = Math.random(); System.out.print(nums[i] + " "); } System.out.println(); ForkJoinPool pool = new ForkJoinPool(); ForkJoinCounter counter = new ForkJoinCounter(nums, 0, nums.length, new Filter() { @Override public boolean accept(double t) { // TODO Auto-generated method stub if(t > 0.5) return true; return false; } }); pool.invoke(counter); System.out.println("N: " + counter.join()); } } interface Filter { public boolean accept(double t); } class ForkJoinCounter extends RecursiveTask<Integer> { private static final long serialVersionUID = 1587552485829092262L; public static final int THREAD_HOLD = 3; private Double[] nums; private int from; private int to; private Filter filter; public ForkJoinCounter(Double[] nums, int from, int to, Filter filter) { super(); this.nums = nums; this.from = from; this.to = to; this.filter = filter; } @Override protected Integer compute() { // TODO Auto-generated method stub int count = 0; if (to - from < THREAD_HOLD) { for (int i = from; i < to; ++i) { if (filter.accept(nums[i])) ++count; } } else { int mid = (from + to) / 2; ForkJoinCounter leftCounter = new ForkJoinCounter(nums, from, mid, filter); ForkJoinCounter rightCounter = new ForkJoinCounter(nums, mid, to, filter); invokeAll(leftCounter, rightCounter); count = leftCounter.join() + rightCounter.join(); } return count; } }
转载请注明原文地址: https://www.6miu.com/read-23430.html

最新回复(0)