所以正如标题所示,我试图找到从 0 到 MAX_LIMIT 的所有素数
示例输入:javac Main.java 8 100
这意味着创建 8 个线程并找到从 0 到 100 的素数,包括 100。我的程序有两个命令行参数:第一个是线程数,第二个是素数的范围(0 到 n)。
样本输出:
质数:2 线程#:13
质数:7 线程编号:15
质数:7 线程#:16
质数:11 线程编号:18
:
然后系统将挂起,并且必须停止该过程:
进程以退出代码 137 结束
我的问题是:
为什么我的线程池超过了它的限制(线程数像 13 或 16,而不是 1-8),我怎样才能让线程不是同时计算相同的数字?我正在考虑使用某种缓存,例如将数字添加到数组列表或其他东西,但我不知道这是否是正确的使用方法。
我可能误解了 ThreadPool 是什么,实际上我在使用与它完全无关的东西。
在这种情况下,我也不确定为什么它会挂起而不是打印从 0 到 100 的所有素数。
如果有更简单的方法来做我想做的事情,我会很想听听。
我会在这里处理这个问题,并且会经常检查这个线程。
是的,这是关于线程的操作系统课程的作业,我通常不会寻求帮助,但我不知所措。所有代码都位于一个文件中。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
private static int MAX_THREADS;
private static int MAX_LIMIT;
private static int numToTest = 0;
public static void main(String[] args) {
int max_threads = Integer.parseInt(args[0]);
int max_limit = Integer.parseInt(args[1]);
MAX_THREADS = max_threads;
MAX_LIMIT = max_limit;
Foo();
}
private static void Foo() {
class PrimeNumberGen implements Runnable {
int num = numToTest;
PrimeNumberGen(int n) {num = n;}
boolean isPrime(int n) { //first test is 0
if(n<2) return false;
if(n==2) return true;
if(n%2==0) return false;
int max = n/2;
for(int i=3; i< max; i=i+2) {
if (n % i == 0)
return false;
}
return true;
}
public void run() {
numToTest++;
if(isPrime(num)) {
System.out.println("Prime Number: "+num+" Thread #:
"+Thread.currentThread().getId());
}
else {
numToTest++;
}
}
}
//Thread t = new Thread(new PrimeNumberGen(num));
//t.start();
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
for (int i = 0;i <= MAX_LIMIT; i++) {
Runnable worker = new PrimeNumberGen(numToTest);
executor.execute(worker);
}
}
}