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多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
13 0
|
4天前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
11 0
|
5天前
|
Java
Java并发Futures和Callables类
Java程序`TestThread`演示了如何在多线程环境中使用`Futures`和`Callables`。它创建了一个单线程`ExecutorService`,然后提交两个`FactorialService`任务,分别计算10和20的阶乘。每个任务返回一个`Future`对象,通过`get`方法获取结果,该方法会阻塞直到计算完成。计算过程中模拟延迟以展示异步执行。最终,打印出10!和20!的结果。
|
6天前
|
安全 Java
Java中的并发编程:理解并发性与线程安全
Java作为一种广泛应用的编程语言,在并发编程方面具有显著的优势和特点。本文将探讨Java中的并发编程概念,重点关注并发性与线程安全,并提供一些实用的技巧和建议,帮助开发人员更好地理解和应用Java中的并发机制。
|
12天前
|
安全 Java
【亮剑】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果
【4月更文挑战第30天】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果。`Future`接口提供`isDone()`、`get()`、`get(timeout, unit)`和`cancel(mayInterruptIfRunning)`等方法。`FutureTask`是`Future`的实现类,可作为`Runnable`执行并返回结果。
|
12天前
|
存储 安全 Java
【亮剑】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能
【4月更文挑战第30天】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能。数据被分割成多个Segment,每个拥有独立锁,允许多线程并发访问不同Segment。当写操作发生时,计算键的哈希值定位Segment并获取其锁;读操作通常无需锁定。内部会根据负载动态调整Segment,减少锁竞争。虽然使用不公平锁,但Java 8及以上版本提供了公平锁选项。理解其工作原理对开发高性能并发应用至关重要。
|
12天前
|
存储 Java 索引
【亮剑】Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap
【4月更文挑战第30天】本文介绍了Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap。文章展示了创建、添加、获取、删除和遍历元素的基本用法。ConcurrentHashMap的内部实现基于分段锁,每个段是一个独立的Hash表,通过分段锁实现并发控制。每个段内部采用数组+链表/红黑树的数据结构,当冲突过多时转为红黑树优化查询。此外,它有扩容机制,当元素超过阈值时,会逐段扩容并翻倍Segment数量,以保持高性能的并发访问。
|
13天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
15天前
|
Java 开发者 UED
Java 异步和事件驱动编程:探索响应式模式
【4月更文挑战第27天】在现代软件开发中,异步和事件驱动编程是提高应用性能和响应性的关键策略。Java 提供了多种机制来支持这些编程模式,使开发者能够构建高效、可扩展的应用程序。
29 4
|
15天前
|
安全 Java
【JAVA】Java并发编程中的锁升级机制
【JAVA】Java并发编程中的锁升级机制