多任务独立线程并发执行的Java实现正确性确认
Java多线程并发实现素数测试基准测试
你给出的代码确实是Java中实现多线程并发的有效方式——通过匿名内部类继承Thread并重写run()方法,调用start()后两个线程会被独立调度执行。但要适配你的实际需求(埃拉托斯特尼筛法、暴力素数测试的基准测试,且确保结果输出后程序再退出),需要做针对性调整,具体说明如下:
核心修改点
- 替换业务逻辑:把
run()里的打印语句换成对应的素数测试算法,同时加入基准计时逻辑,记录每个线程的执行耗时。 - 等待线程完成:原代码中
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
相关产品推荐
相关产品推荐

