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

本文展示了如何利用Java的Runnable接口和多线程技术来实现并行计算求素数的过程,通过创建两个线程分别进行计算,实现了并行计算的效率提升,并与串行计算进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值