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
Java并发编程进阶:深入理解Java内存模型
Java并发编程进阶:深入理解Java内存模型
46 0
|
2月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
3月前
|
Java
探索Java新境界!异步+事件驱动,打造响应式编程热潮,未来已来!
【8月更文挑战第30天】在现代软件开发中,系统响应性和可扩展性至关重要。Java作为主流编程语言,提供了多种机制如Future、CompletableFuture及事件驱动编程,有效提升应用性能。本文探讨Java异步编程模型与事件驱动编程,并介绍响应式模式,助您构建高效、灵活的应用程序。
59 3
|
3月前
|
Java
Java如何标记异步方法
【8月更文挑战第13天】Java如何标记异步方法
31 1
|
1月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
2月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
134 6
【Java学习】多线程&JUC万字超详解
|
2月前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
3月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
73 3
|
3月前
|
前端开发 JavaScript Java
java实现异步回调返回给前端
综上,Java中实现异步回调并将结果返回给前端是一项涉及后端异步处理和前端交互的综合任务。在实际项目中,开发人员需要根据应用需求和性能预期选择合适的异步模型与工具,并进行适当的配置和优化。
204 3