文章目录
前言
一个朋友求助的上机题:使用多线程快速找出20220222后的500个连续的质数,记录质数数值、计算该数值的线程号、计算用时(毫秒)
多线程计算指定值之后的连续质数
代码如下:
import java.util.ArrayList;
import java.util.concurrent.*;
public class PrimeNumberComputeDemo {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(50);
int i = 0;
int number = 20220222;
ArrayList<Integer> primeNumbers = new ArrayList<>();
while (i<500){
number++;
MyCallable t = new MyCallable(number);
Future<Integer> s = service.submit(t);
try {
Integer primeNumber = s.get();
if (primeNumber!=0){
primeNumbers.add(primeNumber);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
service.shutdown();
System.out.println(primeNumbers.size());
}
static class MyCallable implements Callable<Integer> {
private int number;
public MyCallable(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public Integer call() throws Exception {
long l = System.currentTimeMillis();
if (isPrime(number)){
long l1 = System.currentTimeMillis();
System.out.println("质数:"+number+",线程号:"+Thread.currentThread().getId()+","+"耗时:"+(l1-l));
return number;
}else {
return 0;
}
}
}
public static boolean isPrime(final int number) {
if (number <= 1){
return false;
}
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}