• 合并计算


    /**
     * 线程池的作用:并行计算
     * 计算 1-200000 之间的质数
     */
    public class T07_ParallelComputing {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            long start = System.currentTimeMillis();
            List<Integer> result = getPrime(1, 200000);
            long end = System.currentTimeMillis();
            System.out.println("主线程"+(end - start)); // 使用单线程计算的时间
    
            ExecutorService service = Executors.newFixedThreadPool(3);
            ComputeTask t1 = new ComputeTask(1, 100000);
            ComputeTask t2 = new ComputeTask(16000, 190000);
            ComputeTask t3 = new ComputeTask(190001, 200000);
            ComputeTask t4 = new ComputeTask(100001, 160000);  // 这里为什么不均分? 因为数字越大, 质数的数量就越多
            // 提交任务给ExecutorService执行
            Future<List<Integer>> f1 = service.submit(t1);
            Future<List<Integer>> f2 = service.submit(t2);
            Future<List<Integer>> f3 = service.submit(t3);
            Future<List<Integer>> f4 = service.submit(t4);
            // 执行开始
            start = System.currentTimeMillis();
            f1.get();
            f2.get();
            f3.get();
            f4.get();
            end = System.currentTimeMillis();
            System.out.println(end - start);
            service.shutdown();
        }
    
        static class ComputeTask implements Callable<List<Integer>> {
    
            private int start, end;
            
            ComputeTask (int start, int end) {
                this.start = start;
                this.end = end;
            }
    
            @Override
            public List<Integer> call() throws Exception {
                return getPrime(start, end);
            }
        }
        
    
        static boolean isPrime(int num) {
            for (int i = 2; i < num / 2; i++) {
                if (num % i == 0) return false;
            }
            return true;
        }
    
        /**
         * 返回指定范围的质数列表
         */
        static List<Integer> getPrime(int start, int end) {
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < end; i++) {
                if (isPrime(i)) list.add(i);
            }
            return list;
        }
    }
  • 相关阅读:
    SQL Server数据库开发基础
    C#面向对象的概念 ----继承,里氏转换和几种集合(2)
    C#面向对象的概念 ----继承,里氏转换和几种集合(1)
    C#面向对象的概念
    C#的引用类型及stringbuilder类(增补)
    C#方法构建的简单介绍
    C#的结构和数组
    C#debug技巧和反编译器
    C#的语法----程序结构(6)
    C#的语法----程序结构(5)
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11700483.html
Copyright © 2020-2023  润新知