Java并发JUC(java.util.concurrent)ForkJoin/异步回调

简介: Java并发JUC(java.util.concurrent)ForkJoin/异步回调

在这里插入图片描述

👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域:Java、大数据、运维、电子
🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

@[TOC]

ForkJoin是什么

  • 什么是 ForkJoin

    • ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量!

    在这里插入图片描述

  • ForkJoin处理流程:工作窃取
    在这里插入图片描述

Java API

在这里插入图片描述
在这里插入图片描述

  • 试验代码:

    • MyForkJoinTask:

      package icu.lookyousmileface.forkjoin;
      
      import java.util.concurrent.RecursiveTask;
      
      /**
       * @author starrysky
       * @title: MyForkJoinTask
       * @projectName Juc_Pro
       * @description: ForkJon,必须要继承RecursiceTask
       *  * 求和计算的任务!
       *  * 3000   6000(ForkJoin)  9000(Stream并行流)
       *  * // 如何使用 forkjoin
       *  * // 1、forkjoinPool 通过它来执行
       *  * // 2、计算任务 forkjoinPool.execute(ForkJoinTask task)
       *  * // 3. 计算类要继承 ForkJoinTask
       * @date 2021/1/301:11 上午
       */
      class MyForkJoinTask extends RecursiveTask<Long> {
          //开始和结束位置数
          private Long start;
          private Long end;
          //临界值
          private Long temp = 10000L;
      
          public MyForkJoinTask(Long start, Long end) {
              this.start = start;
              this.end = end;
          }
          //计算方法
          @Override
          protected Long compute() {
              //小于临界值就进行计算不拆分
              if ((end-start)<temp){
                  Long sum = 0L;
                  for (Long i = start; i <= end; i++) {
                      sum += i;
                  }
                  return sum;
              }else {
                  //取中位数
                  Long mdie = (start+end)/2;
                  MyForkJoinTask task1 = new MyForkJoinTask(start, mdie);
                  //拆分任务,把任务压入线程队列
                  task1.fork();
                  MyForkJoinTask task2 = new MyForkJoinTask(mdie + 1, end);
                  //拆分任务,把任务压入线程队列
                  task2.fork();
                  //结果汇聚
                  return task1.join()+task2.join();
              }
          }
      }
    • MainTask:

      package icu.lookyousmileface.forkjoin;
      
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.ForkJoinPool;
      import java.util.concurrent.ForkJoinTask;
      import java.util.stream.LongStream;
      
      /**
       * @author starrysky
       * @title: MainTask
       * @projectName Juc_Pro
       * @description: ForkJoin主任务
       * @date 2021/1/301:31 上午
       */
      public class MainTask {
          public static void main(String[] args) throws ExecutionException, InterruptedException {
              /**
               * 使用ForkJoin,适合大数据量
               */
              //创建forkjoin池
      //        ForkJoinPool forkJoinPool = new ForkJoinPool();
      //        //创建自己的ForkJoin计算程序
      //        ForkJoinTask forkJoinTask = new MyForkJoinTask(0L, 10_0000_0000L);
      //        //提交计算任务
      //        ForkJoinTask<Long> submit = forkJoinPool.submit(forkJoinTask);
      //        //获得计算的结果
      //        Long aLong = submit.get();
      //        System.out.println(aLong);
      
              /**
               * 使用stream并行流,非常快
               */
              long result = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
              System.out.println(result);
      
          }
      }

异步回调

在这里插入图片描述

  • 试验代码:

    package icu.lookyousmileface.completables;
    
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author starrysky
     * @title: CompletableUse
     * @projectName Juc_Pro
     * @description: CompletableFuture
     *  * 异步调用: CompletableFuture
     *  * // 异步执行
     *  * // 成功回调
     *  * // 失败回调
     * @date 2021/1/302:13 上午
     */
    public class CompletableUse {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
    //        //没有返回值的异步回调
    //        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{
    //            try {
    //                TimeUnit.SECONDS.sleep(3);
    //            } catch (InterruptedException e) {
    //                e.printStackTrace();
    //            }
    //            System.out.println(" 异步任务执行成功!");
    //        });
    //        System.out.println("main主线程");
    //        //获取异步执行的结果
    //        completableFuture.get();
    
            //又返回值的异步回调
            CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
                System.out.println(Thread.currentThread().getName()+":supplyAsync=>ok");
                int sum = 10/0;
                return 1024;
            });
            //编译
            //编译成功
            System.out.println(completableFuture.whenComplete((u1,u2)->{
                System.out.println("t=>"+u1);//正常的返回结果
                System.out.println("u=>"+u2);//错误信息
                //编译失败
            }).exceptionally((e)->{
                e.printStackTrace();
                return 2233; //错误的返回结果
            }).get());
        }
    }
相关文章
|
3天前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
22天前
|
Java
探索Java新境界!异步+事件驱动,打造响应式编程热潮,未来已来!
【8月更文挑战第30天】在现代软件开发中,系统响应性和可扩展性至关重要。Java作为主流编程语言,提供了多种机制如Future、CompletableFuture及事件驱动编程,有效提升应用性能。本文探讨Java异步编程模型与事件驱动编程,并介绍响应式模式,助您构建高效、灵活的应用程序。
38 3
|
30天前
|
安全 Java 编译器
揭秘JAVA深渊:那些让你头大的最晦涩知识点,从泛型迷思到并发陷阱,你敢挑战吗?
【8月更文挑战第22天】Java中的难点常隐藏在其高级特性中,如泛型与类型擦除、并发编程中的内存可见性及指令重排,以及反射与动态代理等。这些特性虽强大却也晦涩,要求开发者深入理解JVM运作机制及计算机底层细节。例如,泛型在编译时检查类型以增强安全性,但在运行时因类型擦除而丢失类型信息,可能导致类型安全问题。并发编程中,内存可见性和指令重排对同步机制提出更高要求,不当处理会导致数据不一致。反射与动态代理虽提供运行时行为定制能力,但也增加了复杂度和性能开销。掌握这些知识需深厚的技术底蕴和实践经验。
47 2
|
7天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
18天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解
|
29天前
|
存储 Java
Java 中 ConcurrentHashMap 的并发级别
【8月更文挑战第22天】
34 5
|
29天前
|
存储 算法 Java
Java 中的同步集合和并发集合
【8月更文挑战第22天】
21 5
|
28天前
|
缓存 Java 调度
【Java 并发秘籍】线程池大作战:揭秘 JDK 中的线程池家族!
【8月更文挑战第24天】Java的并发库提供多种线程池以应对不同的多线程编程需求。本文通过实例介绍了四种主要线程池:固定大小线程池、可缓存线程池、单一线程线程池及定时任务线程池。固定大小线程池通过预设线程数管理任务队列;可缓存线程池能根据需要动态调整线程数量;单一线程线程池确保任务顺序执行;定时任务线程池支持周期性或延时任务调度。了解并正确选用这些线程池有助于提高程序效率和资源利用率。
34 2
|
30天前
|
Java 开发者
【编程高手必备】Java多线程编程实战揭秘:解锁高效并发的秘密武器!
【8月更文挑战第22天】Java多线程编程是提升软件性能的关键技术,可通过继承`Thread`类或实现`Runnable`接口创建线程。为确保数据一致性,可采用`synchronized`关键字或`ReentrantLock`进行线程同步。此外,利用`wait()`和`notify()`方法实现线程间通信。预防死锁策略包括避免嵌套锁定、固定锁顺序及设置获取锁的超时。掌握这些技巧能有效增强程序的并发处理能力。
19 2
|
20天前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
44 0