# calculation_of_pi **Repository Path**: xujiaming621/calculation_of_pi ## Basic Information - **Project Name**: calculation_of_pi - **Description**: Java线程池并行(近似)计算圆周率pi - **Primary Language**: Java - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-25 - **Last Updated**: 2021-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 求π可以用以下公式: Π/4 约等于 1 - 1/3 + 1/5 - 1/7 +... 具体C语言的实现为: #include #include #include int main(){ float s=1; float pi=0; float i=1.0; float n=1.0; while(fabs(i)>=1e-6){ //这里是结束精度,为了能更好说明并行计算的威力,这里可以尽量取小一点 pi+=i; n=n+2; // 这里设计的很巧妙,每次正负号都不一样 s=-s; i=s/n; } pi=4*pi; printf("pi的值为:%.6f\n",pi); return 0; } 本实验要求: 1、参考以上C语言的π实现,使用任意语言,实现单线程计算π、两线程计算π、四线程计算π 2、在程序中,必须记下不同线程计算π的时间 3、输出格式: 单线程时间:2.000秒 2线程时间:1.5000秒 4线程时间:1.0000秒 本实验采用线程池ExecutorService处理并行问题。 单线程直接照搬C语言参考代码; 2线程把式中“系数为正的项相加”作为一个任务丢给线程池处理,“系数为负的项相加”作为一个任务丢给线程池处理; 4线程把式中项n mod 4=1的项作为一个任务,n mod 4=2的项作为一个任务依次类推。 //手动创建线程池 ExecutorService executorService = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); //把任务丢给线程池处理 executorService.execute(new Runnable() { @Override public void run() { } }); 最后得到结果: runtime: 6.22s runtime: 3.146s runtime: 1.993s 留下一个问题:多线程跑的时间不太稳定,2线程有时候跑5s,有时候跑2s,4线程有时候甚至跑10+s。