Java多线程—Thread统计素数的个数

来源:互联网 发布:淘宝天猫自动回复设置 编辑:程序博客网 时间:2024/04/29 22:37
import java.math.*; public class bb extends Thread{public long start;public long end;public long num=0;public bb(long start,long end){super();this.start=start;this.end=end;}//判断是否为素数long isPrime(long lyy_num)   {long lyy_flag=1;long lyy_s=(int)Math.sqrt(lyy_num);for(long j=2;j<=lyy_s;j++)        {            if(lyy_num%j==0)               {                lyy_flag=0;                break;            }        }return lyy_flag;}//串行算法public long num(){for(long i=start;i<=end;i+=2)num+=isPrime(i);return num+1;}//实现run()public void run(){for(long i=start;i<=end;i+=4){num=num+isPrime(i);}}//得到线程的最终结果public long getNum(){return num;}}public class aa {public static void main(String[] args) throws Exception{bb t1=new bb(1,1000000);   //判断1、5、9、13...        bb t2=new bb(3,1000000);   //判断3、7、11、15...        long startTime=System.currentTimeMillis();          t1.start();        t2.start();        t1.join();        t2.join();        long endTime=System.currentTimeMillis();          System.out.println("并行结果="+(t1.getNum()+t2.getNum()));        System.out.println("并行时间="+(endTime-startTime));                  startTime=System.currentTimeMillis();        bb serial=new bb(3,1000000);           long num=serial.num();           //判断3开始之后的数,最后加上2这一个素数        endTime=System.currentTimeMillis();          System.out.println("串行结果="+num);        System.out.println("串行时间="+(endTime-startTime));  }}

运行结果:

计算:

实验加速比为:858/437=1.963

总结:

                将线程分为奇数和偶数时,由于偶数判断是否素数时,很快就得出结果。因此,线程之间存在负载均衡,导致实验加速比很不理想。

0 0