合并计算
/** * 线程池的作用:并行计算 * 计算 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; } }