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

Posted 尘世间迷茫的小书童

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Java多线程之利用线程池并行计算例子的主要内容,如果未能解决你的问题,请参考以下文章

java面试 啥是多线程

你应该这样去开发接口:Java多线程并行计算

线程池

python多线程并行计算通过向线程池ThreadPoolExecutor提交任务的实现方法

线程池与并行度

springboot多任务并行+线程池处理+等待获取执行结果