用java串行和并行实现圆周率
时间: 2024-03-11 16:43:33 浏览: 69
软件构造原理作业 lab03
首先需要了解圆周率的计算方法。一种常用的方法是蒙特卡罗方法,即生成一组随机点,统计其中落在单位圆内的点数,通过点数比上总数得到圆内面积与正方形面积的比值,再乘以4即可得到圆周率的近似值。
在Java中,可以使用串行和并行两种方式实现该方法。
串行实现:
```
public static double calculatePiSerial(long numThrows) {
long inCircle = 0;
for (long i = 0; i < numThrows; i++) {
double x = Math.random();
double y = Math.random();
if (x*x + y*y <= 1) {
inCircle++;
}
}
return 4.0 * inCircle / numThrows;
}
```
并行实现:
```
public static double calculatePiParallel(long numThrows) {
long inCircle = LongStream.range(0, numThrows)
.parallel()
.filter(i -> {
double x = Math.random();
double y = Math.random();
return x*x + y*y <= 1;
})
.count();
return 4.0 * inCircle / numThrows;
}
```
在并行实现中,使用了Java 8中的Stream API和并行流特性,将随机点的生成和落在圆内的判断并行处理,提高了计算效率。
需要注意的是,在使用并行流时,需要保证随机数的生成是线程安全的,可以使用ThreadLocalRandom代替Math.random()实现。同时,需要在多核CPU上运行该程序才能发挥并行计算的优势。
阅读全文