JUC-ForkJoin和CompletableFuture

本文对比了Java并发编程中的ForkJoin框架与CompletableFuture,通过实例展示了如何使用它们进行任务分解和异步执行,以提高程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ForkJoin代码

package com.cb.demo.example;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

class MyTask extends RecursiveTask<Integer>{

    private static final Integer ADJUST_VALUE=10;

    private int begin;
    private int end;
    private int result;

    public MyTask(int begin,int end){
        this.begin=begin;
        this.end=end;
    }

    @Override
    protected Integer compute() {

        if ((end-begin)<=ADJUST_VALUE){
            for (int i = begin; i <=end ; i++) {
                result=result+i;
            }
        }else{
            int middle=(end+begin)/2;
            MyTask task=new MyTask(begin,middle);
            MyTask task1=new MyTask(middle+1,end);
            task.fork();
            task1.fork();
            result=task.join()+task1.join();
        }

        return result;
    }
}

public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
            MyTask myTask=new MyTask(0,100);
        ForkJoinPool threadPool=new ForkJoinPool();

        ForkJoinTask<Integer> forkJoinTask= threadPool.submit(myTask);
        System.out.println(forkJoinTask.get());

        threadPool.shutdown();
    }
}

CompletableFuture代码

package com.cb.demo.example;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "没有返回");
        });
        completableFuture.get();

        //异步回调
        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "有返回");
            int age=10/0;
            return "2022";
        });

        stringCompletableFuture.whenComplete((t,u)->{
            System.out.println("-------t:"+t);
            System.out.println("-------u:"+u);
        }).exceptionally(f->{
            System.out.println("***excption"+f.getMessage());
            return "404";
        }).get();
    }
}

### JUC相关内容及课程推荐 #### 什么是JUC? `JUC` 是 `java.util.concurrent` 的缩写,它是Java并发编程的核心工具库之一。该包提供了丰富的类来支持多线程开发,包括锁、信号量、原子变量以及各种线程池实现等[^2]。 #### 狂神说视频教程简介 狂神说是目前广受好评的一系列Java教学视频,其中关于JUC的内容涵盖了从基础到高级的知识点。通过这些视频,可以深入了解多线程机制、线程安全问题及其解决方案。以下是具体的学习方向: 1. **多线程基础知识** - 学习如何创建管理线程。 - 掌握线程生命周期及相关API调用方式[^3]。 2. **同步与异步处理** - 使用`synchronized`关键字解决资源竞争问题。 - 利用`Lock`接口替代传统监视器模式以获得更灵活的功能[^5]。 3. **原子操作与CAS算法** - CAS(Compare And Swap),即比较并交换技术,在无锁情况下完成高效的更新动作。 - 需要注意的是,单纯依赖CAS可能会引发所谓的“ABA问题”,因此引入了版本号概念加以改进[^4]^。 4. **高阶特性探索** - ForkJoin框架优化复杂计算任务分解执行效率。 - CompletableFuture简化异步回调流程控制逻辑编写难度。 #### 推荐学习路径 对于初学者而言,建议按照如下顺序逐步深入掌握JUC相关技能: - 观看《狂神说-Java》中的多线程章节部分; - 结合官方文档或者翻译后的中文版资料加深理论认识水平; - 动手实践编码练习巩固所学知识点效果最佳。 ```java // 示例代码展示简单的CountDownLatch应用 import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) throws InterruptedException { int numberOfThreads = 5; CountDownLatch latch = new CountDownLatch(numberOfThreads); Runnable task = () -> { System.out.println(Thread.currentThread().getName() + " is done."); latch.countDown(); }; for (int i = 0; i < numberOfThreads; ++i){ new Thread(task).start(); } latch.await(); // 主线程等待其他线程全部完成后才继续往下走 System.out.println("All threads have finished their work."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐路上的小人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值