您的位置:首页 > 编程语言 > Java开发

java 多线程并行计算之求素数(星星笔记)

2014-09-15 20:57 330 查看
使用Runnable接口实现求素数的java多线程并行程序如下(并行2个线程):

package com.xing.prime;

/**
 * 
 * @author Yinxing
 *
 */
public class ParallelPrime {

	public static void main(String[] args) throws InterruptedException
	{
		// TODO Auto-generated method stub

		long leng = 10000000;
		long startTime,endTime;
		Prime primeone = new Prime(1,leng);
		Prime primetwo = new Prime(3, leng);
		Thread threadone = new Thread(primeone);
		Thread threadtwo = new Thread(primetwo);
		//-------------------并行计算--------------------
		startTime = System.currentTimeMillis();
		threadone.start();
		threadtwo.start();
		threadone.join();
		threadtwo.join();
		endTime = System.currentTimeMillis();
        System.out.println("并行结果 = " + (primeone.getSum() + primetwo.getSum()));  
        System.out.println("并行时间 = " + (endTime - startTime)); 
        //-------------------串行计算--------------------
        startTime = System.currentTimeMillis();
        Prime primethree = new Prime( 3, leng);
        primethree.serial();
        endTime = System.currentTimeMillis();
        System.out.println("串行结果 = " + primethree.getSum());  
        System.out.println("串行时间 = " + (endTime - startTime)); 
	}
}
class Prime implements Runnable{

	private long start ;
	private long end ;
	private int sum = 0;
	public Prime(long st,long en){
		this.start = st;
		this.end = en;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		long i,j,k;
		for( i = start; i <= end; i += 4)
		{
			  k = (long) Math.sqrt(i);
			  for(j=2; j<=k; j++)
			      if(i%j == 0)
			    	   break;
			  if(j>k)
			  {
			     //System.out.println(i);
			      sum ++ ;     //并行计算的素数个数包含 1 (1 不是素数,但是并行漏了一个 2)
			  }
	     }
	}
	
	public void serial() {  //串行计算一个
		long i,j,k;
		for( i= 3 ; i <= end; i += 2 )
		{
			  k = (long) Math.sqrt(i);
			  for(j=2; j<=k; j++)
			      if(i%j == 0)
			    	   break;
			  if(j>k)
			  {
			     // System.out.println(i);
			      sum ++ ;
			  }
	     }
		sum ++ ;   //加上一个素数---2----
	}
	public int getSum() {
		return this.sum;
	}
	
}
运行结果:



相对加速比: 19541/10390=1.880750721847941
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: