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 }

猜你喜欢

转载自www.cnblogs.com/mxh-java/p/12244321.html