分布与并行计算—并行计算π(Java)
生活随笔
收集整理的這篇文章主要介紹了
分布与并行计算—并行计算π(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;}@Overridepublic 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.0BigDecimal PI = null;//PIint 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/64long 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;}@Overridepublic 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)^ia = 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();} }總結
以上是生活随笔為你收集整理的分布与并行计算—并行计算π(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦为什么会梦到前任
- 下一篇: 分布与并行计算—日志挖掘(Java)