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)+"毫秒");
    }
}

2、异步回调:
点击查看代码
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();
    }
}

posted @ 2025-04-17 17:02  黑影五  阅读(7)  评论(0)    收藏  举报