读书人

并行计作数组的和

发布时间: 2012-10-15 09:45:24 作者: rapoo

并行计算数组的和

//并行计算数组的和public class ConcurrentCalculator {private ExecutorService exec;private int cpuCoreNumber;private List<Future<Long>> tasks = new ArrayList<Future<Long>>();public ConcurrentCalculator() {cpuCoreNumber = Runtime.getRuntime().availableProcessors();exec = Executors.newFixedThreadPool(cpuCoreNumber);}public Long sum(final int[] numbers) {// 根据CPU核心个数拆分任务,创建FutureTask并提交到Executorfor (int i = 0; i < cpuCoreNumber; i++) {int increment = numbers.length / cpuCoreNumber + 1;int start = increment * i;int end = increment * i + increment;if (end > numbers.length)end = numbers.length;SumCalculator subCalc = new SumCalculator(numbers, start, end);FutureTask<Long> task = new FutureTask<Long>(subCalc);tasks.add(task);if (!exec.isShutdown()) {exec.submit(task);}}return getResult();}/** * 迭代每个只任务,获得部分和,相加返回 *  * @return */public Long getResult() {Long result = 0l;for (Future<Long> task : tasks) {try {// 如果计算未完成则阻塞Long subSum = task.get();result += subSum;} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}return result;}public void close() {if (!exec.isShutdown())exec.shutdown();}// 内部类class SumCalculator implements Callable<Long> {private int[] numbers;private int start;private int end;public SumCalculator(final int[] numbers, int start, int end) {this.numbers = numbers;this.start = start;this.end = end;}public Long call() throws Exception {Long sum = 0l;for (int i = start; i < end; i++) {sum += numbers[i];}return sum;}}public static void main(String[] args) {int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13 };ConcurrentCalculator calc = new ConcurrentCalculator();Long sum = calc.sum(numbers);System.out.println(sum);calc.close();}}

读书人网 >编程

热点推荐