java///b. 编写一个程序,使用多线程实现并行计算素数的算法,提高计算效率。
时间: 2024-10-15 08:12:58 浏览: 44
在 Java 中,我们可以使用并发编程技术,如 `Thread` 类或者 `ExecutorService` 和 `Callable` 来实现多线程并行计算素数。下面是一个简单的例子,展示如何使用 `ExecutorService` 来计算一定范围内的素数:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class PrimeCalculator {
private static final int PARALLELISM_LEVEL = Runtime.getRuntime().availableProcessors();
public static void main(String[] args) throws InterruptedException, ExecutionException {
List<Future<Boolean>> primeFutures = new ArrayList<>();
int start = 1; // 开始计算的最小素数候选数
int end = 100; // 计算结束的最大素数候选数
long startTime = System.currentTimeMillis();
ExecutorService executor = Executors.newFixedThreadPool(PARALLELISM_LEVEL);
for (int i = start; i <= end; i++) {
Future<Boolean> future = executor.submit(new IsPrimeTask(i));
primeFutures.add(future);
}
// 等待所有任务完成,并收集结果
List<Integer> primes = collectPrimes(primeFutures);
executor.shutdown();
long endTime = System.currentTimeMillis();
// 打印计算结果和时间
System.out.println("Calculated Primes: " + primes);
System.out.printf("Time taken: %d milliseconds%n", endTime - startTime);
}
private static List<Integer> collectPrimes(List<Future<Boolean>> primeFutures) {
List<Integer> primes = new ArrayList<>();
for (Future<Boolean> future : primeFutures) {
if (future.get()) { // 如果任务返回true,则i是素数
primes.add(future.getPreviousResult()); // 获取原始数值
}
}
return primes;
}
private static class IsPrimeTask implements Callable<Boolean> {
private final int number;
public IsPrimeTask(int number) {
this.number = number;
}
@Override
public Boolean call() {
// 判断是否为素数的逻辑...
boolean isPrime = checkIfPrime(number);
setPreviousResult(number); // 存储原始数值以便后续获取
return isPrime;
}
// 实现素数检查逻辑
private boolean checkIfPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}
// 为了获取原始数值,在任务内部存储它
private volatile Integer previousResult;
// 设置原始数值
private synchronized void setPreviousResult(int number) {
previousResult = number;
}
public Integer getPreviousResult() {
return previousResult;
}
}
}
阅读全文