并行计算π
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;
BigDecimal PI = null;
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));
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 = BigDecimal.valueOf(-1).divide(BigDecimal.valueOf(1024),PRECISION, BigDecimal.ROUND_DOWN).pow(cur);
b = BigDecimal.valueOf(32).divide(BigDecimal.valueOf(4).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(1)),PRECISION, BigDecimal.ROUND_DOWN);
c = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(4).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(3)),PRECISION, BigDecimal.ROUND_DOWN);
d = BigDecimal.valueOf(256).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(1)),PRECISION, BigDecimal.ROUND_DOWN);
e = BigDecimal.valueOf(64).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(3)),PRECISION, BigDecimal.ROUND_DOWN);
f = BigDecimal.valueOf(4).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(5)),PRECISION, BigDecimal.ROUND_DOWN);
g = BigDecimal.valueOf(4).divide(BigDecimal.valueOf(10).multiply(BigDecimal.valueOf(cur)).add(BigDecimal.valueOf(7)),PRECISION, BigDecimal.ROUND_DOWN);
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();
}
}