首页 > 其他分享 >JUC(七)分支合并框架

JUC(七)分支合并框架

时间:2023-03-09 19:58:00浏览次数:43  
标签:JUC begin 框架 int Integer CompletableFuture Fi new 分支

JUC分支合并框架

简介

Fork/Join可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务的结果合并称为最终的计算结果。

  • Fork:负责将任务拆分
  • Join:合并拆分任务
  • ForkJoinPool:分支合并池,添加分支合并任务,使用get得到计算结果

image-20230309152534509

案例一:实现1+...+100,要求计算过程不能有相差超过10的数字的相加

class MyTask extends RecursiveTask<Integer> {
    private final Integer VALUE = 10;
    private Integer begin;
    private Integer end;
    MyTask(int begin, int end) {
        this.begin = begin;
        this.end = end;
    }
    @Override
    public Integer compute() {
        int result = 0;
        if(end - begin >= VALUE) {
            int mid = (end + begin) / 2;
            MyTask myTask1 = new MyTask(begin, mid);
            MyTask myTask2 = new MyTask(mid + 1, end);
            myTask1.fork();
            myTask2.fork();

            result += myTask1.join() + myTask2.join();
        } else {
            for(int i = begin; i <= end; i++) {
                result += i;
            }
        }
        return result;
    }
}

public class ForkJoinTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyTask task = new MyTask(1, 100);
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> submit = forkJoinPool.submit(task);
        Integer integer = submit.get();
        forkJoinPool.shutdown();
        System.out.println(integer);
    }
}

案例二:实现分支计算斐波那契数列

class Fi extends RecursiveTask<Integer>{
    private final int n;
    Fi(int n) {
        this.n = n;
    }
    @Override
    protected Integer compute() {
        if(n == 0 || n ==1) {
            return 1;
        }
        Fi f1 = new Fi(n-1);
        Fi f2 = new Fi(n-2);
        f1.fork();
        f2.fork();

        return f1.join() + f2.join();
    }
}

public class ForkJoinTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Fi fi = new Fi(5);
        ForkJoinPool pool = new ForkJoinPool();
        Integer integer = pool.submit(fi).get();
        System.out.println(integer);
    }
}

JUC CompletableFuture异步回调

image-20230309152550411

两个异步方法:

  • CompletableFuture.runAsync:不带返回值的异步方法
  • CompletableFuture.supplyAsync:携带返回值的异步方法
public static CompletableFuture<Void> runAsync(Runnable runnable) {
    return asyncRunStage(ASYNC_POOL, runnable);
}

/**
 * Returns a new CompletableFuture that is asynchronously completed
 * by a task running in the given executor after it runs the given
 * action.
 *
 * @param runnable the action to run before completing the
 * returned CompletableFuture
 * @param executor the executor to use for asynchronous execution
 * @return the new CompletableFuture
 */
public static CompletableFuture<Void> runAsync(Runnable runnable,
                                               Executor executor) {
    return asyncRunStage(screenExecutor(executor), runnable);
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
    CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
        System.out.println(Thread.currentThread().getName());
    });
    future1.get();

    CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
        System.out.println(Thread.currentThread().getName());
        int i = 1 / 0;
        return 1024;
    });
    future2.whenComplete((t, u) -> {
        System.out.println(t);
        System.out.println(u);
    });
}

whenComplete获取返回值的时候,第一个参数为值,第二个参数为异步产生的异常

ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-1
null
java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero

标签:JUC,begin,框架,int,Integer,CompletableFuture,Fi,new,分支
From: https://www.cnblogs.com/tod4/p/17201195.html

相关文章

  • JUC(五)Callable
    Callable接口创建线程的几种方式继承Thread类实现Runnable接口通过Callable接口线程池使用Runnable接口无法获取到线程返回的结果,因此在jdk1.5后java提供了Callabl......
  • JUC(八)ThreadLocal
    ThreadLocal简介ThreadLocal提供局部线程变量,这个变量与普通的变量不同,每个线程在访问ThreadLocal实例的时候,(通过get或者set方法)都有自己的、独立初始化变量副本。Threa......
  • 一Spring框架基础--2设计模式
    一Spring框架基础--2设计模式1.3spring用到的设计模式1.3.1责任链模式有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象......
  • 一Spring框架基础--3动态代理
    一Spring框架基础--3动态代理1.4代理模式1.4.1Java代码执行流程1.4.1.1class文件Java编译器编译好Java文件后,产生.class文件在磁盘,该文件是二进制文件,内容只有jvm......
  • IdentityServer4: 集成 AspNetCore Identity 框架
    IdentityServer4集成identity框架新增依赖包在IdentityServer4项目中新增集成AspNetCoreIdentity所需的依赖包:<PackageReferenceInclude="IdentityServer......
  • SpringBoot框架
    SpringBoot框架https://blog.csdn.net/friggly/article/details/123888590?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7......
  • 02、大数据安全分析技术框架与关键技术
    转载公众号《微言晓意》,仅用于个人学习大数据分析通过对安全告警、系统日志以及网络流量等海量多源异构数据进行采集、存储与分析,打破原有网络安全烟囱式防护模式,将所有安......
  • Celery框架的基本使用与介绍
    目录Celery介绍、安装、基本使用一、Celery服务1、celery架构2、celery快速使用3、celer包结构【使用包写一个小游戏】Celery介绍、安装、基本使用一、Celery服务什么......
  • 亚马逊RedShift调研-浅谈技术框架、优缺点及网上风评
    RedShift是亚马逊开发的一个站式云上数据仓库服务。网上案例与风评较少,做的一些个人总结。1.RedShift优势及特色1.1官方介绍①借助AmazonRedshift的数据仓库......
  • 【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框
     Webix是Javascript库一种软件产品用于加速Web开发的JavaScriptUI库和框架Webix用于跨平台Web应用程序开发的JS框架102个UI小部件和功能丰富的CSS/HT......