使用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