java的递归任务和分治算法实现大数组数据求和
2016-01-07 20:53
573 查看
package june.shen; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; class work { static ForkJoinPool fjPool = new ForkJoinPool(); } @SuppressWarnings("serial") class ArraySum extends RecursiveTask<Long> { static final int min_unit = 100;//最小的划分结束单元,单元内部用串行方式执行 int low; int high; int[] array; ArraySum(int[] arr, int lo, int hi) { array = arr; low = lo; high = hi; } protected Long compute() { if(high - low <= min_unit) { long sum = 0; for(int i=low; i < high; ++i) sum += array[i]; return sum; } else { int mid = low + (high - low) / 2; ArraySum left = new ArraySum(array, low, mid);//划分为左右两部分 ArraySum right = new ArraySum(array, mid, high); left.fork();//左边开始 long rightRes = right.compute();//右边开始 long leftRes = left.join(); return leftRes + rightRes;//合并两边的结果 } } static public long sum(int[] a) { return work.fjPool.invoke(new ArraySum(a,0,a.length));//启动一个分治求和的线程池 } }
package june.shen; import java.util.Random; public class ArraySumTest { public static void main(String[] args) { // TODO Auto-generated method stub int[] testArray=new int[100000]; for(int i=0;i<100000;i++) { Random ran = new Random(); testArray[i] = ran.nextInt(1000); } System.out.println(ArraySum.sum(testArray)); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Manifest 用法
- android之定时器AlarmManager
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序