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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值