创建两个子线程用于求解素数之和 完全数之和
利用join()的方法加入主线程,分别执行两个子线程,待子线程结束后再继续执行主线程
完全数:真因子数(不包括本身的因子)之和等于其本身
public class Question_2 extends Thread{
static counter_1 thread_1=new counter_1();
static counter_2 thread_2=new counter_2();
public static void main(String[]args)throws Exception{
thread_1.start();//等子线程结束后在执行主线程
thread_1.join();
thread_2.start();
thread_2.join();
System.out.println(thread_1.getAnswer()*thread_2.getAnswer());
}
}
class counter_1 extends Thread{//计算素数之和
long answer_1;
public boolean isPrime(int i){
int end=(int)Math.sqrt(i);
if(i<2){
return false;
}
if(i==2){
return true;
}
if(i%2==0){//排除偶数
return false;
}
for(int j=3;j<=end;j+=2){
if(i%j==0)return false;
}
return true;
}
public void run(){
for(int i=1;i<10000;i++){
if(isPrime(i)) answer_1+=i;
}
System.out.println(answer_1);
}
public long getAnswer(){
return answer_1;
}
}
class counter_2 extends Thread{
long answer_2;
public boolean isPerfect(int i){
int sum=0;
if(i%2!=0){//完全数必是偶数
return false;
}
else{
for(int j=1;j<=i/2;j++){
if(i%j==0){
sum+=j;
}
}
if(sum==i){
return true;
}
else
return false;
}
}
public void run(){
for(int i=1;i<=10000;i++){
if(isPerfect(i)) answer_2+=i;
}
System.out.println(answer_2);
}
public long getAnswer(){
return answer_2;
}
}