您的位置:首页 > 编程语言 > Java开发

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

2017-05-05 14:10 369 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 并发