多线程寻找数字n及之后的m个质数

多线程寻找数字n及之后的m个质数

一、思路

在Java中实现多线程查找从 n 开始的 m 个质数,可以使用java.util.concurrent包中的ExecutorServiceCallable接口。这里使用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();
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值