• Java多线程之利用线程池并行计算例子


     1 import java.util.ArrayList;
     2 import java.util.List;
     3 import java.util.concurrent.*;
     4 import java.util.concurrent.Callable;
     5 import java.util.concurrent.ExecutorService;
     6 import java.util.concurrent.Executors;
     7 import java.util.concurrent.Future;
     8 
     9 /**
    10  * 并行计算例子
    11  * nasa
    12  */
    13 public class ParallelComputing {
    14 
    15     public static void main(String[] args) {
    16 
    17         long startTime = System.currentTimeMillis();
    18         List<Integer> results = getPrime(1, 200000);
    19         long endTime = System.currentTimeMillis();
    20         System.out.println("耗时:" + (endTime -startTime));
    21 
    22         final int cpuCoreNum = 4;
    23 
    24         ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum);
    25 
    26         MyTask t1 = new MyTask(1, 80000);
    27         MyTask t2 = new MyTask(80001, 130000);
    28         MyTask t3 = new MyTask(130001, 170000);
    29         MyTask t4 = new MyTask(170001, 200000); //为什么不平均分 和质数计算速度有关
    30 
    31         Future<List<Integer>> s1 = service.submit(t1);
    32         Future<List<Integer>> s2 = service.submit(t2);
    33         Future<List<Integer>> s3 = service.submit(t3);
    34         Future<List<Integer>> s4 = service.submit(t4);
    35 
    36         startTime = System.currentTimeMillis();
    37         try {
    38             System.out.println(s1.get());
    39             System.out.println(s2.get());
    40             System.out.println(s3.get());
    41             System.out.println(s4.get());
    42         } catch (InterruptedException e) {
    43             e.printStackTrace();
    44         } catch (ExecutionException e) {
    45             e.printStackTrace();
    46         }
    47         endTime = System.currentTimeMillis();
    48         System.out.println("耗时:" + (endTime - startTime));
    49         service.shutdown();
    50     }
    51 
    52     static class MyTask implements Callable<List<Integer>> {
    53 
    54         int startPos, endPos;
    55 
    56         MyTask(int start, int end) {
    57             this.startPos = start;
    58             this.endPos = end;
    59         }
    60 
    61         @Override
    62         public List<Integer> call() throws Exception {
    63             List<Integer> result = getPrime(startPos, endPos);
    64             return result;
    65         }
    66     }
    67 
    68     /**
    69      * 判断是不是素数或质数
    70      * @param num
    71      * @return
    72      */
    73     static boolean isPrime(int num) {
    74         for (int i=2; i<=num/2; i++) {
    75             if(num % i == 0) return false;
    76         }
    77         return true;
    78     }
    79 
    80     /**
    81      * 给一个范围判断这个范围内有多少个质数
    82      * @param start
    83      * @param end
    84      * @return
    85      */
    86     static List<Integer> getPrime(int start, int end) {
    87         List<Integer> results = new ArrayList<>();
    88         for (int i=start; i<=end; i++) {
    89             if(isPrime(i)) results.add(i);
    90         }
    91         return results;
    92     }
    93 
    94 }
  • 相关阅读:
    ie不支持 event.stopPropagation 的解决方式
    jquery 获取 元素.text( ) 里面的值 需要进行去空格去换行符操作
    使用插件实现某元素展示特定行文字,超出显示...
    css文字超出显示省略号
    纯css实现各种三角形图案
    jQuery判断鼠标是否在某个元素内
    z-tree相关设置
    js提取字符串中的汉字
    扩展ie中不兼容的startsWith,endsWith方法
    获取浏览器URL携带过来的参数/获取url中"?"符后的字串
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12244321.html
Copyright © 2020-2023  润新知