java多线程计算1/1+1/2+...+1/n为何比单线程要慢
java多线程学习交流
每个java程序猿都会遇到的多线程学习,总体来说学习起来比稍微吃力,毕竟设计都线程安全问题等等。
今天为了重温一下多线程(为了面试),计算1/1+1/2+…+1/n的值。
思路就是将整个计算段切分为若干个小段(大数据思想),再将小段累加。
上代码
// An highlighted block
package com.zw;
import java.util.concurrent.CountDownLatch;
public class ThreedTest {
public static void main(String[] args) throws Exception {
int maxIndex = 1000000000;
int iThread = 1000;
long b = System.currentTimeMillis();
CountDownLatch countDownLatch2 = new CountDownLatch(iThread);
MyThreed.setCountDownLatch(countDownLatch2);
int evrNum = maxIndex/iThread;
for(int i=0;i<iThread;i++) {
MyThreed my = new MyThreed();
my.setBegin(i*evrNum+1);
my.setEnd((i+1)*evrNum);
Thread thread = new Thread(my);
thread.start();
}
countDownLatch2.await();
long e = System.currentTimeMillis();
//多线程用时结果
System.out.println(e-b);
System.out.println(Test2.dd);
long b1 = System.currentTimeMillis();
Test2.dd=0;
for(int i=1;i<=maxIndex;i++) {
Test2.add(i);
}
System.out.println(Test2.dd);
long e1 = System.currentTimeMillis();
//单线程用时结果
System.out.println(e1-b1);
}
}
class Test2{
public static double dd =0;
public static synchronized void add(double index) {
dd =dd + 1/index;
}
}
class MyThreed implements Runnable{
private static CountDownLatch countDownLatch;
private int begin;
private int end;
@Override
public void run() {
for(int i=begin;i<=end;i++) {
Test2.add(i);
}
countDownLatch.countDown();
}
public int getBegin() {
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public static CountDownLatch getCountDownLatch() {
return countDownLatch;
}
public static void setCountDownLatch(CountDownLatch countDownLatch) {
MyThreed.countDownLatch = countDownLatch;
}
}
执行结果:
48292
21.300481502328893
21.30048150234855
2068
结果是意外的:多线程表现出来的结果元不如单线程表现的结果
不知道那位大神解释一下?
PS:不是多线程区分太多的原因,各位网友可以测试