首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏移动开发面面观

    ForkJoinPool简介ForkJoinPool

    ForkJoinPool 背景描述 过去我们在线程池解决问题时,通常维护了一个阻塞的任务队列。每个工作线程在任务完成后,就会去任务队列里面寻找任务。 在JDK7中新增了ForkJoinPoolForkJoinPool采用分治+work-stealing的思想。可以让我们很方便地将一个大任务拆散成小任务,并行地执行,提高CPU的使用率。 关于ForkJoinPool的精妙之处,我们将在后面的使用中慢慢说明。 如何使用 构造方法 ? Android官方文档中给出了三个构造方法。 我们注意到在构造方法中,我们可以设置ForkJoinPool的最大工作线程数、工作线程工厂、拒绝任务的Handler和同步模式。 执行任务 ? ? ForkJoinPool提供了两套执行任务的API,它们的区别主要是返回的结果类型不同。invoke方法返回执行的结果,而submit方法返回执行的任务。

    1.4K50发布于 2018-07-03
  • 来自专栏FunTester

    ForkJoinPool实践

    资料指出ForkJoinPool比较适合计算密集型的任务。 这里还有另外的方案来实现,如果只是得到QPS和RT数据的话,比ForkJoinPool更加合适,这里先不分享了。 ForkJoinPool API相比较ExecutorService还是比较简单的。 主要的功能3个:创建任务的ForkJoinPool、创建任务分配规则和收集任务结果。 下面我以一个数组求和的Demo演示一下ForkJoinPool的功能。 首先我们需要定义一个ForkJoinPool,通常使用java.util.concurrent.ForkJoinPool#ForkJoinPool(int)或者java.util.concurrent.ForkJoinPool 翻看源码之后,看起来ForkJoinPool构造方法参数还是挺多的,如果都要自定义比较麻烦也是没多大必要的,所以我就选上面提到的第一种API来创建ForkJoinPool

    42430编辑于 2023-08-04
  • 来自专栏后端架构

    浅析ForkJoinPool

    ForkJoinPool类的作用ForkJoinPool类是Java中用于支持Fork/Join框架的关键类。它提供了一种用于并行执行任务的机制,通常用于处理递归划分的任务。 ForkJoinPool类允许将大任务拆分成更小的子任务,然后并行执行这些子任务,并最终将结果合并起来。通过ForkJoinPool类,可以充分利用多核处理器的优势,提高并行任务的执行效率。 举个例子以下是一个简单的Java代码示例,演示如何使用ForkJoinPool类来并行计算数组中元素的总和:import java.util.concurrent.ForkJoinPool;import forkJoinPool = new ForkJoinPool(); int sum = forkJoinPool.invoke(new SumCalculator(array, 0, 分析代码逻辑ForkJoinPool 类的代码实现原理主要基于工作窃取(Work-Stealing)算法。

    62100编辑于 2024-02-18
  • 来自专栏只喝牛奶的杀手

    多线程—ForkJoinPool

    为什么要用ForkJoinPoolForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可 创建ForkJoinPool并提交任务 @org.junit.Test public static void main(String args[]) throws ExecutionException System.currentTimeMillis(); int poolSize = Runtime.getRuntime().availableProcessors(); ForkJoinPool pool = new ForkJoinPool(poolSize); System.out.println("tNumber = " + pool.getParallelism());

    72630发布于 2019-08-26
  • 来自专栏javathings

    ForkJoinPool 是什么?

    ForkJoinPool 是什么? ForkJoinPool 是 Java 7 中引入的并发库类。 因此,ForkJoinPool 的适用范围不大,仅限于某任务能被分解成多个子任务,且这些子任务运行的结果可以合并成最终结果。 ForkJoinPool 中实现了一种工作窃取算法,所谓工作窃取指的是闲置线程的任务队列空了,就从其他忙碌线程中的任务队列中处理任务。 ForkJoinPool 的运行模式如下: ? fjpool = new ForkJoinPool();//默认按照CPU核数来创建线程数量。 在 Main 方法中,ForkJoinPool 中提交了 Fibonacci 类的实例。因此可以通过 ForkJoinPool 线程池中的线程完成计算。

    1.8K30发布于 2018-11-13
  • 来自专栏涓流

    ForkJoinPool使用及原理

    ForkJoinPool主要用来使用分治法, 在处理任务队列中一个任务的时候,可以让其中的线程创建新的任务并挂起当前任务,此时的线程就可以选择队列中的子任务来执行。 核心组件 ForkJoinPool ForkJoinPool 是 ExecutorService 的一个实现类,主要的工作如下: 接收外部任务的提交(调用 ForkJoinPool 的 invoke/execute (ForkJoinPool pool) { super("aForkJoinWorkerThread"); // 指定工作线程名称 this.pool = WorkQueue volatile WorkQueue[] workQueues; 任务队列(WorkQueue)是ForkJoinPool与其它线程池区别最大的地方,在ForkJoinPool内部, 参考资料 ForkJoinPool 原理 ForkJoinPool 实现 [A Java Fork/Join Framework - Doug Lea]

    1.3K21编辑于 2022-06-28
  • 来自专栏全栈程序员必看

    浅谈辄止_java forkjoinpool

    的简单使用 package com.muyichen.demo.forkjoin; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ForkJoinPool // 合并子任务 sum = leftResult + rightResult; } return sum; } public static void main(String[] args) { ForkJoinPool forkjoinPool = new ForkJoinPool(); //生成一个计算任务,计算1加到100 ForkJoinExample task = new ForkJoinExample(1, 100); //执行一个任务 Future<Integer> result = forkjoinPool.submit(task); try { log.info("result:{}", result.get

    37030编辑于 2022-11-08
  • 来自专栏全栈程序员必看

    forkjoin原理_java forkjoinpool

    org.apache.commons.lang3.RandomUtils; import java.math.BigInteger; import java.util.Arrays; import java.util.concurrent.ForkJoinPool cost time "+(System.currentTimeMillis()-start)); start = System.currentTimeMillis(); // 执行ForkJoin需要用到ForkJoinPool ,调用commonPool方法是JDK1.8的实现 ForkJoinPool forkJoinPool = ForkJoinPool.commonPool(); ForkJoinMultiply multiply = new ForkJoinMultiply(numbers); BigInteger result = forkJoinPool.invoke(multiply); System.out.println

    30420编辑于 2022-11-05
  • 来自专栏全栈程序员必看

    fork join语句_java forkjoinpool

    框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果 Fork:把一个复杂任务进行分拆,大事化小 Join:把分拆任务的结果进行合并 二、3大类 2.1 ForkJoinPool 继承后可以实现递归(自己调自己)调用的任务 三、使用示例 import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool throws ExecutionException, InterruptedException { MyTask myTask = new MyTask(0,100); ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit( myTask); System.out.println(forkJoinTask.get()); forkJoinPool.shutdown(); } } 版权声明

    48620编辑于 2022-11-05
  • 来自专栏全栈程序员必看

    线程的notify方法_forkjoinpool默认线程数量

    众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢?

    70610编辑于 2022-10-04
  • 来自专栏Devops专栏

    14.ForkJoinPool 分支-合并框架 工作窃取

    14.ForkJoinPool 分支-合并框架 工作窃取 Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 代码演示 import java.time.Duration; import java.time.Instant; import java.util.concurrent.ForkJoinPool; void main(String[] args) { //1.获取当前的时间 Instant start = Instant.now(); //2.创建ForkJoinPool 线程池 ForkJoinPool pool = new ForkJoinPool(); //3.创建一个计算框架任务 ForkJoinTask<Long>

    43630编辑于 2022-03-23
  • 来自专栏全栈程序员必看

    forkjoinpool 弊端_oracle数据库分页查询sql

    org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool forkJoinPoll") public void forkJoinPoll(){ log.info("forkJoinPoll start..."); ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); // 总页数,提前查询出来,数据量不大就不用拆任务

    1.4K30编辑于 2022-09-27
  • 来自专栏日拱一兵

    还有年味的文章,ForkJoinPool 大型图文现场

    forkJoinPool = new ForkJoinPool(4, factory, null, false); // 快速创建 ForkJoinPool 方法 // ForkJoinPool ,比如: 有竞争就需要锁,ForkJoinPool 是如何控制状态的呢? ForkJoinPool 的线程数是怎么控制的呢? 上面说的路由规则的具体逻辑是什么呢? ...... 源码分析(JDK 1.8) ForkJoinPool 的源码涉及到大量的位运算,这里会把核心部分说清楚,想要理解的更深入,还需要大家自己一点点追踪查看 结合上面的铺垫,你应该知道 ForkJoinPool 故事就得从 ForkJoinPool 的构造方法说起 ForkJoinPool 构造方法 public ForkJoinPool() { this(Math.min(MAX_CAP, Runtime.getRuntime JDK1.8 Stream 底层就充分用到了 ForkJoinPool,你知道还有哪里用到了 ForkJoinPool 了吗? ForkJoinPool 最多会有多少个槽位?

    87410发布于 2021-02-25
  • 来自专栏Web 技术

    ForkJoinPool 你真的明白和用对了吗

    ForkJoinPool 是一个功能强大的 Java 类,用于处理计算密集型任务,使用 ForkJoinPool 分解计算密集型任务,并并行执行它们,能够产生更好的性能。 使用 ForkJoinPool 构建线程池 ForkJoinPool 存储着 worker,这些 worker 是在机器的每个 CPU 核心上运行的进程。 最后,ForkJoinPool 类通过 Join 的方式提供一个输出结果,如下图所示。 当任务在 ForkJoinPool 中提交时,该进程将被分成更小的进程并推送到共享队列中。 ForkJoinPool 主类 让我们快速浏览一下支持使用 ForkJoinPool 进行处理的主类。 ForkJoinPool 创建一个线程池来使用 ForkJoin:它的工作原理与其他线程池类似。 何时使用 ForkJoinPool ForkJoinPool 不应该在所有情况下都使用。如前所述,最好将其用于高度密集的并发进程。

    1.7K10编辑于 2023-10-07
  • 来自专栏Java note

    ForkJoinPool:大任务拆分,让并行嗨起来!

    针对这两个问题,本文即将介绍的ForkJoinPool给出了可选的答案。 在本文中,我们将首先从分治算法开始介绍,接着体验ForkJoinPool中自定义任务的实现,最后再深入到Java中去理解ForkJoinPool的原理和用法。 三、ForkJoinPool设计与源码分析 在Java中,ForkJoinPool是Fork/Join模型的实现,于Java7引入并在Java8中广泛应用。 构造ForkJoinPool的几种不同方式 ForkJoinPool中有四个核心参数,用于控制线程池的并行数、工作线程的创建、异常处理和模式指定等。 ForkJoinPool监控 对于一个复杂框架来说,实时地了解ForkJoinPool的内部状态是十分必要的。因此,ForkJoinPool提供了一些常用方法。

    1.4K10编辑于 2024-03-18
  • 来自专栏狼王编程之路

    阿里的面试题带你认识ForkJoinPool

    Yes,就是我们今天的主角——ForkJoinPool,但是它要怎么实现呢? forkJoinPool = ForkJoinPool.commonPool(); // 提交任务 ForkJoinTask<Long> forkJoinTask = 什么是ForkJoinPoolForkJoinPool原理 初始化ForkJoinPool ForkJoinPool pool = ForkJoinPool.commonPool() public static ForkJoinPool 我们聚焦ForkJoinPool主线流程,CountedCompleter相关内容另文再介绍。 WorkQueue WorkQueue是一个双端队列,它定义在ForkJoinPool类里。

    62210发布于 2021-06-01
  • 来自专栏彤哥读源码

    死磕 java线程系列之ForkJoinPool深入解析

    forkJoinPool = ForkJoinPool.commonPool(); // 提交任务 ForkJoinTask<Long> forkJoinTask = forkJoinPool.submit 问题:普通线程池能否实现ForkJoinPool这种计算方式呢,即大任务拆中任务,中任务拆小任务,最后再汇总? ? 你可以试试看(-᷅_-᷄) OK,下面我们正式进入ForkJoinPool的解析。 ForkJoinPool内部原理 ForkJoinPool内部使用的是“工作窃取”算法实现的。 ? ()/invokeAll(); 总结 (1)ForkJoinPool特别适合于“分而治之”算法的实现; (2)ForkJoinPool和ThreadPoolExecutor是互补的,不是谁替代谁的关系, 答:ManagedBlocker相当于明确告诉ForkJoinPool框架要阻塞了,ForkJoinPool就会启另一个线程来运行任务,以最大化地利用CPU。

    83010发布于 2019-11-14
  • 来自专栏JAVA核心

    深入解析Java中的ForkJoinPool:分而治之,并行处理的利器

    一、ForkJoinPool概述 ForkJoinPool是Java并发包java.util.concurrent中的一个类,它提供了一个工作窃取算法的实现,能够高效地处理大量可以被拆分成较小子任务的任务 二、ForkJoinPool的工作原理 ForkJoinPool作为Java中的并行处理框架,其工作原理基于分治算法和工作窃取算法。下面将更深入地探讨其内部机制。 2.1. 在ForkJoinPool中,这种策略被用于并行处理任务。 当一个大任务提交给ForkJoinPool时,它首先会被拆分成多个小任务。这些小任务是相互独立的,可以并行执行。 步骤2:使用ForkJoinPool执行任务 接下来,我们可以使用ForkJoinPool来执行这个求和任务。 首先,我们需要创建一个ForkJoinPool对象,并将求和任务提交给它执行。 (释放资源) } } 四、ForkJoinPool的优势 高效利用多核处理器:ForkJoinPool通过工作窃取算法和并行处理机制,能够充分利用多核处理器的性能,提高程序的并发处理能力。

    97210编辑于 2024-03-21
  • 来自专栏做不甩锅的后端

    java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)

    在前面介绍了ForkJoinPool的骨架源码之后,我们来看看ForkJoinPool的核心组成。WorkQueue的源码。 1.类结构及其成员变量 1.1 类结构和注释 WorkQueue是ForkJoinPool的核心内部类,是一个Contented修饰的静态内部类。 >[] 存放task的数组,初始化的时候不会进行分配,采用懒加载的方式 pool final ForkJoinPool 指向ForkJoinPool的指针 owner final ForkJoinWorkerThread >[] a; ForkJoinPool p; int b = base, s = top, n; //判断array不为空 if ((a = array) ! 这样来实现一个高效的Deque,以供ForkJoinPool来操作。 这与学习ConcurrentHashMap等容器的源码一样,可以看出作者为了性能的优化,采用了很多独特的方式来实现。

    96320发布于 2020-09-28
  • 来自专栏做不甩锅的后端

    java线程池(八):ForkJoinPool源码分析之四(ForkJoinWorkerThread源码)

    如果确实创建了这个类的子类,还需要在ForkJoinPool中提供自定义的ForkJoinWorkerThreadFactory来使用。 1.2 常量 主要有两个: final ForkJoinPool pool; // the pool this thread works in final ForkJoinPool.WorkQueue 请参见ForkJoinPool的内部文档。此类仅仅维护了指向pool和WorkQueue的链接。pool字段在构造的时候直接设置。 其中registerWorker与deregisterWorker方法 ,我们可以参考前面的ForkJoinPool源码解读。 ForkJoinPool中创建工作线程的过程 此时再来结合ForkJoinPool中的ForkJoinWorkerThreadFactory,就能明白ForkJoinThread的创建意义了。

    1.4K20发布于 2020-10-29
领券