帮我写一个java程序,编写基于多线程的素数(是除了自身和1以外,没有其他素数因子的自然数)判定程序。待判定的整数经过键盘录人后存放在一-个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过键盘查询判定的结果。
时间: 2023-06-02 07:08:13 浏览: 86
好的,这是一个技术问题,我可以回答。下面是Java代码,实现了基于多线程的素数判定程序。
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class PrimeNumberDetector {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Integer> numsToCheck = new ArrayList<>();
List<Boolean> results = new ArrayList<>();
System.out.println("Please input the number of integers to check:");
int numCount = scanner.nextInt();
System.out.println("Please input the integers to check:");
for (int i = 0; i < numCount; i++) {
int num = scanner.nextInt();
numsToCheck.add(num);
results.add(null); // initialize results with null
}
checkPrimeNumbers(numsToCheck, results);
System.out.println("Prime Number Detection Complete.");
System.out.println("The results are:");
for (int i = 0; i < numCount; i++) {
System.out.println(numsToCheck.get(i) + " is " + (results.get(i) ? "prime." : "not prime."));
}
}
public static void checkPrimeNumbers(List<Integer> nums, List<Boolean> results) {
int threadCount = 10;
int numsPerThread = nums.size() / threadCount;
List<Thread> threads = new ArrayList<>(threadCount);
for (int i = 0; i < threadCount; i++) {
int startIndex = i * numsPerThread;
int endIndex = (i == threadCount - 1) ? nums.size() : (i + 1) * numsPerThread; // the last thread takes the remaining numbers
Thread thread = new Thread(new PrimeNumberDetectorTask(nums.subList(startIndex, endIndex), results.subList(startIndex, endIndex)));
threads.add(thread);
thread.start();
}
try {
for (Thread thread : threads) {
thread.join(); // wait for all threads to finish
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class PrimeNumberDetectorTask implements Runnable {
private final List<Integer> nums;
private final List<Boolean> results;
public PrimeNumberDetectorTask(List<Integer> nums, List<Boolean> results) {
this.nums = nums;
this.results = results;
}
@Override
public void run() {
for (int i = 0; i < nums.size(); i++) {
int num = nums.get(i);
boolean isPrime = isPrime(num);
results.set(i, isPrime);
}
}
private boolean isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
}
```
在该程序中,我们创建了一个 PrimeNumberDetectorTask 类作为线程的任务,用来判定一个整数是否是素数。在主程序中,我们读取待判定的整数,将它们分为若干等份,并将每份分给一个线程进行判定。最后整理每个数的判定结果并输出。
该程序仅仅是一个简单的示例,实际情况中可能需要更复杂的算法、更好的多线程调度和更完善的输入输出处理。但是可以作为基本思路的参考。
阅读全文