多线程寻找数字n及之后的m个质数
一、思路
在Java中实现多线程查找从 n 开始的 m 个质数,可以使用java.util.concurrent
包中的ExecutorService
和Callable
接口。这里使用ExecutorService
来管理多个线程,Callable
接口来表示可以并发执行的任务,并返回任务的结果。
- 处理步骤
- 首先使用
ExecutorService
创建一个线程池,将任务分配给多个线程进行并发查找。 - 然后实现
Callable<Integer>
接口,并覆盖了call()
方法,call()
方法中执行从给定的起始数开始查找质数,并返回一个处理结果(目标数是质数则返回,否则返回0)。 - 最后,通过
Future
对象获取每个线程返回的结果,并将结果记录到Set
集合中。
- 首先使用
在并发处理中,每个任务获取到的待处理数都比上一个任务的处理数大1,从而确保了找到的m个质数没有重复且是相邻的m个质数
二、具体实现
-
MyCallable类
/** * @Author: isabener * @Date: 2023-08-01 */ public class MyCallable implements Callable<Integer> { private final int num; public MyCallable(int num) { this.num = num; } @Override public Integer call() throws Exception { long startTime = System.currentTimeMillis(); if (isPrime(num)) { long endTime = System.currentTimeMillis(); System.out.println("找到质数:" + num + " 耗时:" + (endTime - startTime) + "ms"); return num; } return 0; } /** * 判断一个数是不是质数 **/ public static boolean isPrime(Integer num) { if (num <= 1) { return false; } for (int i = 2; i < Math.sqrt(num); i++) { if (num % i == 0) { return false; } } return true; } }
-
SearchPrimeBuyMultiThread类
/** * @Author: isabener * @Date: 2023-08-01 */ public class SearchPrimeBuyMultiThread { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建一个拥有 20 个线程的固定大小线程池,这个线程池可以用于提交任务,然后线程池会自动调度这些任务并执行它们 ExecutorService service = Executors.newFixedThreadPool(20); // 定义目标数字n int num = 22222223; // 寻找m个质数 int count = 1000; // 定义存放m个质数的列表 Set<Integer> primeSet = new HashSet<>(); while (count > 0) { MyCallable myCallable = new MyCallable(num++); Future<Integer> result = service.submit(myCallable); // result>0表示当前数字是质数 if (result.get() > 0) { count--; primeSet.add(result.get()); } } // 输出最终寻找到的质数个数 System.out.println("找到质数:" + primeSet.size() + "个"); // 关闭线程池,释放资源 service.shutdown(); } }