浏览 1868 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-18
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; public class ConcurrentCalculator2 { private ExecutorService exec; CompletionService<Long> service; private int cpuCoreNumber; private List<Future<Long>> tasks = new ArrayList<Future<Long>>(); // 内部类 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 ConcurrentCalculator2() { cpuCoreNumber = Runtime.getRuntime().availableProcessors(); exec = Executors.newFixedThreadPool(cpuCoreNumber); service = new ExecutorCompletionService<Long>(exec); } public Long sum(final int[] numbers) { // 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor for (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); tasks.add(service.submit(subCalc)); /* * 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 (int i = 0; i < tasks.size(); i++) { try { result += service.take().get(1, TimeUnit.SECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return result; } public void close() { exec.shutdown(); } } mian方法: public class ExecutCalculator { public static void main(String[] str) { int[] numbers = new int[100000]; for (int i = 0; i < 100000; i++) { numbers[i] = i; } long start = System.currentTimeMillis(); ConcurrentCalculator2 calc = new ConcurrentCalculator2(); Long sum = calc.sum(numbers); for (int i = 0; i < 10; i++) sum = calc.sum(numbers); long end = System.currentTimeMillis(); System.out.println(end - start); System.out.println(sum); calc.close(); long start1 = System.currentTimeMillis(); ExecutCalculator executCalculator = new ExecutCalculator(); long sum2 = executCalculator.sumlocal(numbers); for (int i = 0; i < 10; i++) { sum2 += executCalculator.sumlocal(numbers); } long end1 = System.currentTimeMillis(); System.out.println(end1 - start1); System.out.println(sum2); } public long sumlocal(int[] numbers) { long sum = 0l; for (int i = 0; i < numbers.length; i++) { sum += numbers[i]; } return sum; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |