package com.basic; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * @program JavaBooks * @description: 并行计算的小例子 * @author: mf * @create: 2020/01/01 14:26 */ public class T24 { public static void main(String[] args) throws ExecutionException, InterruptedException { long start = System.currentTimeMillis(); List results = getPrime(1, 200000); long end = System.currentTimeMillis(); System.out.println(end - start); System.out.println(Runtime.getRuntime().availableProcessors());// 看看自己的cpu几核 // 但算了, 还是取4把 final int cpuCoreNum = 4; ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum); MyTask t1 = new MyTask(1, 80000); MyTask t2 = new MyTask(80001, 130000); MyTask t3 = new MyTask(130001, 170000); MyTask t4 = new MyTask(170001, 200000); Future> f1 = service.submit(t1); Future> f2 = service.submit(t2); Future> f3 = service.submit(t3); Future> 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 MyTask implements Callable> { int startPos, endPos; public MyTask(int startPos, int endPos) { this.startPos = startPos; this.endPos = endPos; } @Override public List call() throws Exception { List r = getPrime(startPos, endPos); return r; } } /** * 判断该数是否为质数 * @param num * @return */ private static boolean isPrime(int num) { for (int i = 2; i <= num / 2; i++) { if (num % i == 0) return false; } return true; } /** * 在一定范围内的质数 * @param start * @param end * @return */ private static List getPrime(int start, int end) { List results = new ArrayList<>(); for (int i = start; i <= end; i++) { if (isPrime(i)) results.add(i); } return results; } }