java基础7
package kuangstudy.forkjoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;
public class Test01 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
test1();//计算用时:6838
test2();//耗时:3866
test3();//计算用时:108
}
//测试直接执行
public static void test1(){
Long sum=0L;
long start=System.currentTimeMillis();
for (Long i = 1L; i <= 10_0000_0000L; i++) {
sum+=i;
}
long end=System.currentTimeMillis();
System.out.println("sum1="+sum+"计算用时:"+(end-start));
}
//测试forkjoin的执行效率
public static void test2() throws ExecutionException, InterruptedException {
long start=System.currentTimeMillis();
ForkJoinPool forkJoinPool=new ForkJoinPool();
System.out.println("sum2="+forkJoinPool.submit(new Fork(0L, 10_0000_0000L)).get());
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
//测试流式计算
public static void test3(){
long start=System.currentTimeMillis();
long sum= LongStream.rangeClosed(0L,10_0000_0000L).parallel().reduce(0,Long::sum);
long end=System.currentTimeMillis();
System.out.println("sum3="+sum+"计算用时:"+(end-start));
}
}
class Fork extends RecursiveTask<Long>{
private long start;
private long end;
private long temp=10000L;
public Fork(long start,long end){
this.end=end;
this.start=start;
}
public Fork() {
super();
}
@Override
protected Long compute() {
if ((end-start)<temp){
Long sum=0L;
for (long i = start; i <= end; i++) {
sum+=i;
}
return sum;
}
else {
long middle = (start + end) / 2;
Fork fork1 = new Fork(start, middle);
fork1.fork();
Fork fork2 = new Fork( middle+1,end);
fork2.fork();
return fork1.join()+fork2.join();
}
}
}
执行结果:
sum1=500000000500000000计算用时:6838
sum2=500000000500000000
耗时:3866
sum3=500000000500000000计算用时:108
Process finished with exit code 0