You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多任务独立线程并发执行的Java实现正确性确认

Java多线程并发实现素数测试基准测试

你给出的代码确实是Java中实现多线程并发的有效方式——通过匿名内部类继承Thread并重写run()方法,调用start()后两个线程会被独立调度执行。但要适配你的实际需求(埃拉托斯特尼筛法、暴力素数测试的基准测试,且确保结果输出后程序再退出),需要做针对性调整,具体说明如下:

核心修改点

  1. 替换业务逻辑:把run()里的打印语句换成对应的素数测试算法,同时加入基准计时逻辑,记录每个线程的执行耗时。
  2. 等待线程完成:原代码中main线程启动子线程后会直接退出,可能导致子线程还没输出结果程序就终止。需要用join()方法让main线程等待所有子线程执行完毕。

适配需求的示例代码

import java.util.Arrays;

class PrimeBenchmark {
    public static void main(String args[]) {
        // 线程1:埃拉托斯特尼筛法基准测试
        Thread sieveThread = new Thread() {
            @Override
            public void run() {
                long startTime = System.currentTimeMillis();
                int maxNum = 1_000_000;
                boolean[] isPrime = new boolean[maxNum + 1];
                Arrays.fill(isPrime, true);
                isPrime[0] = isPrime[1] = false;
                
                for (int i = 2; i * i <= maxNum; i++) {
                    if (isPrime[i]) {
                        for (int j = i * i; j <= maxNum; j += i) {
                            isPrime[j] = false;
                        }
                    }
                }
                
                long endTime = System.currentTimeMillis();
                System.out.printf("埃拉托斯特尼筛法完成,耗时:%d ms%n", endTime - startTime);
            }
        };

        // 线程2:暴力素数测试基准测试
        Thread bruteThread = new Thread() {
            @Override
            public void run() {
                long startTime = System.currentTimeMillis();
                int maxNum = 1_000_000;
                int primeCount = 0;
                
                for (int num = 2; num <= maxNum; num++) {
                    if (isPrimeBrute(num)) {
                        primeCount++;
                    }
                }
                
                long endTime = System.currentTimeMillis();
                System.out.printf("暴力测试完成,共找到%d个素数,耗时:%d ms%n", primeCount, endTime - startTime);
            }

            // 暴力素数判断逻辑
            private boolean isPrimeBrute(int num) {
                if (num <= 1) return false;
                for (int i = 2; i * i <= num; i++) {
                    if (num % i == 0) return false;
                }
                return true;
            }
        };

        // 启动两个并发线程
        sieveThread.start();
        bruteThread.start();

        // 等待两个线程执行完毕,确保结果输出后程序退出
        try {
            sieveThread.join();
            bruteThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("所有基准测试执行完成,程序退出");
    }
}

额外说明

  • 除了匿名内部类继承Thread,你也可以通过实现Runnable接口来创建线程(比如new Thread(new Runnable() { ... })),两种方式本质都是定义线程执行逻辑,效果一致。
  • join()方法会让当前线程(这里是main线程)阻塞,直到目标线程执行完成,避免程序提前终止导致结果丢失。
  • 基准计时逻辑必须放在每个线程的run()方法内部,因为每个线程的执行是独立的,各自的耗时需要单独统计。

内容的提问来源于stack exchange,提问作者Trev Chiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:27