题目要求:
编写一个有两个线程的程序,第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数,最后输出结果。
IsPrimeThread类 //实现计算逻辑的线程类
public class IsPrimeThread extends Thread{
public IsPrimeThread(String name) { //有参构造方法
super(name);
}
private int num =0; //素数总数
private boolean isPrime; //是否是素数
@Override
public void run() {
String threadName = Thread.currentThread().getName();
if (threadName.equals("prime")){
num =0;
for (int a = 2; a <= 100000; a++) { //1不是质数从2开始
//用来判断不是质数,
isPrime = true;
for (int i = 2; i <=Math.sqrt(a); i++) {//Math.sqrt,求一个数的平方根
//for循环内原写法是 int i = 2;i <a;i++ 换成Math.sqrt(a)在循环次数多时可大幅提升计算效率,减少运行时间。
//不是质数跳出循环
if ((a%i) == 0){
isPrime =false;
break;
}
}
if (isPrime){
num ++;
//System.out.println(a);
}
}
System.out.println("线程 " + threadName + " [1,100000]中的质数总数为 :" + num);
}
if (threadName.equals("prime1")){
num =0;
for (int a = 100000; a <= 200000; a++) { //1不是质数从2开始
//用来判断不是质数,
isPrime = true;
for (int i = 2; i <=Math.sqrt(a); i++) {//Math.sqrt,求一个数的平方根
//不是质数跳出循环
if ((a%i) == 0){
isPrime =false;
break;
}
}
if (isPrime){
num ++;
//System.out.println(a);
}
}
System.out.println("线程 " + threadName + " [100000,200000]中的质数总数为 :" + num);
}
}
}
Demo类 //主线程
public class Demo {
public static void main(String[] args) {
IsPrimeThread prime = new IsPrimeThread("prime");
IsPrimeThread prime1 = new IsPrimeThread("prime1");
prime.setPriority(5); //设置线程优先级
prime1.setPriority(1);
prime.start();
prime1.start();
}
}
输出结果:
线程 prime [1,100000]中的质数总数为 :9592
线程 prime1 [100000,200000]中的质数总数为 :8392