zoukankan      html  css  js  c++  java
  • JDK5.0 ThreadPool 多线程计算

    package karl.test.threadpool;

    import java.util.concurrent.Callable;
    import java.util.concurrent.CompletionService;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorCompletionService;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    public class ConcurrentCalculator2 {
        private ExecutorService exec;

        private CompletionService<Long> completionService;

        private int cpuCoreNumber;

        class SumCalculator implements Callable<Long> {
            private int[] numbers;

            private int start;

            private int end;

            public SumCalculator(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);
            completionService = new ExecutorCompletionService<Long>(exec);
        }

        public Long sum(final int[] numbers) {
            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);
                if (!exec.isShutdown()) {
                    completionService.submit(subCalc);
                }
            }
            return getResult();
        }

        public Long getResult() {
            Long result = 0L;
            for (int i = 0; i < cpuCoreNumber; i++) {
                try {
                    Long subSum = completionService.take().get();//take()已经完成的任务,如果暂时还没有完成的任务,take()方法也会阻塞。
                    result += subSum;
                } catch (InterruptedException e) {
                } catch (ExecutionException e) {
                }
            }
            return result;
        }

        public void close() {
            exec.shutdown();
        }

        public static void main(String[] args) {
            int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
            ConcurrentCalculator2 calc = new ConcurrentCalculator2();
            Long sum = calc.sum(numbers);
            System.out.println(sum);
            calc.close();
        }
    }
  • 相关阅读:
    从Android APP里面打开其他应用
    jQuery 中 serialize() 方法会受到asp.net 页面影响
    javascript 对象转换 json 的插件
    MVC 4将jQuery升级到1.9出现各种问题。。。
    用MVC做可拖拽的留言板,利用 Jquery模板 JsRender
    未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
    处理MVC中默认的Json方法返回时间的问题
    jQuery 中使用$.post 无法获取 json
    MVC中用 BundleCollection 压缩CSS时图片路径问题
    MVC中返回Json的几种声明方式
  • 原文地址:https://www.cnblogs.com/zhonghan/p/2232675.html
Copyright © 2011-2022 走看看