分布与并行计算—并行计算π(Java)

并行计算π

public class pithread extends Thread {

    private static long mini=1000000000;
    private long start,diff;
    double sum=0;double cur=1/(double)mini;
    public pithread(long start,long diff) {
        this.start=start;
        this.diff=diff;
    }

    @Override
    public void run() {

        long i=start;


        for(;i<mini;i+=diff)
        {
            double x=(i+0.5)*cur;
            sum+=4/(1+x*x);
        }


    }

    public double getSum() {
        return sum;
    }

    public static void main(String[] args) {

        double t1,t2;
        pithread thread0=new pithread(1,1);
        t1=System.currentTimeMillis();
        thread0.start();
        try {
            thread0.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2=System.currentTimeMillis();
        System.out.println("单线程时间:"+(double)(t2-t1)/1000+'秒');

        pithread thread5=new pithread(1,2);
        pithread thread6=new pithread(2,2);
        t1=System.currentTimeMillis();
        thread5.start();
        thread6.start();
        try {
            thread5.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2=System.currentTimeMillis();
        System.out.println("2线程时间:"+(double)(t2-t1)/1000+'秒');

        pithread thread=new pithread(1,4);
        pithread thread2=new pithread(2,4);
        pithread thread3=new pithread(3,4);
        pithread thread4=new pithread(4,4);
       t1=System.currentTimeMillis();
        thread.start();
        thread2.start();
        thread3.start();
        thread4.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

         t2=System.currentTimeMillis();

        System.out.println("4线程时间:"+(double)(t2-t1)/1000+'秒');
    }
}

并行计算多位π

public class CalculatePThread {
  static BigDecimal tempt = new BigDecimal(0);
    public synchronized static void  add(BigDecimal bigDecimal)
    {
       tempt= tempt.add(bigDecimal);

    }


    public static void main(String[] args) {

        ExecutorService executorService=Executors.newFixedThreadPool(10);
        final  int PRECISION=100000;
        //定义各个引用变量/ 1000000000.0
        BigDecimal PI = null;//PI
        int i=0;   long startTime = System.currentTimeMillis();//开始时间
        System.out.println("计算机正在全力计算中...请稍候..."+startTime);


        while (true){

            if(System.currentTimeMillis()-startTime>180000) break;
            CountDownLatch countDownLatch=new CountDownLatch(10);
        for(int j=0;j<10;j++)
        {
            MutiPi cur=new MutiPi(i++,countDownLatch);
            executorService.execute(cur);

        }
        try { System.out.println(tempt);
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        }
       System.out.println("wcl");
        System.out.println(tempt);
        PI = tempt.divide(BigDecimal.valueOf(64));//PI=tempt/64
        long endTime = System.currentTimeMillis();//结束时间
        System.out.println(PI.toString());

        Lifegame.writeTxt(PI.toString());
        executorService.shutdown();
    }
}

public class MutiPi implements Runnable {
    int cur;
    final  int PRECISION=100000;
    CountDownLatch countDownLatch;
    Lock lock=new ReentrantLock();
    BigDecimal bigDecimal=BigDecimal.valueOf(0);
    public MutiPi(int cur, CountDownLatch countDownLatch) {
        this.cur = cur;this.countDownLatch=countDownLatch;
    }

    @Override
    public void run() {

        BigDecimal a = null;//公式的第一项
        BigDecimal b = null;//公式的第二项
        BigDecimal c = null;//公式的第三项
        BigDecimal d = null;//公式的第四项
        BigDecimal e = null;//公式的第五项
        BigDecimal f = null;//公式的第六项
        BigDecimal g = null;//公式的第七项
        BigDecimal h = null;//公式的第八项
        //a=(-1/1024)^i
        a = BigDecimal.valueOf(-1).divide(BigDecimal.valueOf(1024),PRECISION, BigDecimal.ROUND_DOWN).pow(cur);//valueOf()方法,BigDecimal的静态方法,将 double 转换为 BigDecimal
        //pow()方法,BigDecimal类中的方法,原型BigDecimal pow(int n, MathContext mc);
        //返回其值为 (this^n) 的 BigDecimal

        //b=32/(4i+1)
        b = BigDecimal.valueOf(32).divide(BigDecimal.valueOf(4).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(1)),PRECISION, BigDecimal.ROUND_DOWN);
        //为求精确,计算精度比输出值多三位
        //ROUND_DOWN接近零的舍入模式(截取)

        //c=1/(4n+3)
        c = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(4).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(3)),PRECISION, BigDecimal.ROUND_DOWN);

        //d=256/(10n+1)
        d = BigDecimal.valueOf(256).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(1)),PRECISION, BigDecimal.ROUND_DOWN);

        //e=64/(10n+3)
        e = BigDecimal.valueOf(64).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(3)),PRECISION, BigDecimal.ROUND_DOWN);

        //f=4/(10n+5)
        f = BigDecimal.valueOf(4).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(5)),PRECISION, BigDecimal.ROUND_DOWN);

        //g=4/(10n+7)
        g = BigDecimal.valueOf(4).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(7)),PRECISION, BigDecimal.ROUND_DOWN);

        //h=1/(10n+9)
        h = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(9)),PRECISION, BigDecimal.ROUND_DOWN);

          CalculatePThread.add (a.multiply(d.add(h).subtract(b).subtract(c).subtract(e).subtract(f).subtract(g)));



        System.out.println("线程"+cur+"计算完成"+countDownLatch.getCount());
        countDownLatch.countDown();

    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值