JUC_05
1、ForkJoin
大数据: Map Reduce
特点:工作窃取
说明:下列代码是计算0-1000000000之和。
普通,forkJoin,Stream
点击查看代码
package org.li.pojo;
import java.util.concurrent.RecursiveTask;
//1、forkjoinPool
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long start;
private Long end;
private static final Long temp=10000L;
public ForkJoinDemo(long start, long end) {
this.start = start;
this.end = end;
}
@Override
public Long compute(){
if((end-start)<temp){
long sum=0L;
for (long i =start ; i<=end; i++){
sum += i ;
}
return sum;
}else{
long middle = (Long)(end+start)/2;
ForkJoinDemo forkJoinDemo1 = new ForkJoinDemo(start,middle);
forkJoinDemo1.fork();
ForkJoinDemo forkJoinDemo2 = new ForkJoinDemo(middle+1,end);
forkJoinDemo2.fork();
return forkJoinDemo1.join()+forkJoinDemo2.join();
}
}
}
点击查看代码
package org.li.pojo;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;
import java.util.stream.Stream;
public class ForkJoinMain {
public static void main(String[] args) throws ExecutionException, InterruptedException {
test1();
test2();
test3();
}
public static void test1(){
long sum=0L;
Long startdate=System.currentTimeMillis();
for (long i = 0L; i<=10_0000_0000; i++){
sum += i;
}
Long enddate=System.currentTimeMillis();
System.out.println("结果为:"+sum+".耗时:"+(enddate-startdate)+"毫秒");
}
public static void test2() throws ExecutionException, InterruptedException {
long sum=0L;
Long startdate=System.currentTimeMillis();
ForkJoinPool forkJoinPool =new ForkJoinPool();
ForkJoinTask<Long> forkJoinTask = new ForkJoinDemo(0L,10_0000_0000);
ForkJoinTask<Long> ftask=forkJoinPool.submit(forkJoinTask);
sum=ftask.get();
Long enddate=System.currentTimeMillis();
System.out.println("结果为:"+sum+".耗时:"+(enddate-startdate)+"毫秒");
}
public static void test3() {
long sum=0L;
Long startDate=System.currentTimeMillis();
long start=0L;
long end=10_0000_0000;
sum=LongStream.rangeClosed(start,end).parallel().reduce(0,Long::sum);
Long endDate=System.currentTimeMillis();
System.out.println("结果为:"+sum+".耗时:"+(endDate-startDate)+"毫秒");
}
}
点击查看代码
package org.li;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class CompleteFuturnDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> afv=CompletableFuture.runAsync(()->{
//int i=1/0;
System.out.println(Thread.currentThread().getName()+"无参");
});
afv.get();
System.out.println("主线程"+"print");
CompletableFuture<Integer> afs= CompletableFuture.supplyAsync(()->{
System.out.println(Thread.currentThread().getName()+"233");
return 1024;
});
//System.out.println(afs.get());
afs.whenComplete((t,u)->{
System.out.println(t);
System.out.println(t);
}).exceptionally((e)->{
e.printStackTrace();
return 233;
}).get();
}
}

浙公网安备 33010602011771号