首页 > 其他分享 >ThreadPoolExecutor 与 ForkJoinPool比较

ThreadPoolExecutor 与 ForkJoinPool比较

时间:2024-09-20 15:34:21浏览次数:8  
标签:task ForkJoinPool 适合 任务 线程 比较 ThreadPoolExecutor

都是 Java 并发包 java.util.concurrent 中用于执行任务的线程池,但它们的设计目的和适用场景有所不同。下面是两者之间的主要区别:

设计目标

  • ThreadPoolExecutor:

    • 主要用于 处理 大量异步任务
    • 适用于各种类型的任务,特别是那些 独立运行且不需要相互协作的任务。
    • 提供了高度的灵活性,可以通过配置不同的参数来调整线程池的行为。
  • ForkJoinPool:

    • 专为 可以分解成更小子任务 的工作负载设计。
    • 适用于 可以递归分解的大规模并行计算任务,如分治算法(快速排序、归并排序等)。
    • 内部使用工作窃取算法来提高线程利用率。

核心机制

  • ThreadPoolExecutor:

    • 使用一个阻塞队列来存储待执行的任务。
    • 线程数量可以在 corePoolSize 和 maximumPoolSize 之间动态变化。
    • 一旦线程数超过 corePoolSize 且有空闲线程时,这些空闲线程会在 keepAliveTime 后被回收。
  • ForkJoinPool:

    • 每个工作线程都有自己的双端队列来存储任务。
    • 当一个线程完成当前任务后,它会尝试从其他线程的任务队列中“窃取”任务,从而保持所有线程忙碌。
    • 默认情况下,线程池大小等于可用处理器的数量,但也可以通过构造函数进行配置。

任务提交

  • ThreadPoolExecutor:

    • 任务通常通过 execute(Runnable task) 或 submit(Callable<T> task) 方法提交。
    • 任务之间通常是独立的,不需要相互协作。
  • ForkJoinPool:

    • 任务通过 submit(ForkJoinTask<?> task) 或 invoke(ForkJoinTask<?> task) 方法提交。
    • 任务通常继承自 RecursiveAction(无返回值)或 RecursiveTask<V>(有返回值),并且可以调用 fork() 和 join() 方法分解和合并任务

适用场景

  • ThreadPoolExecutor:

    • 适合处理 I/O 密集型任务,例如网络请求、文件读写等。
    • 适合处理 CPU 密集型任务,但需要手动管理任务的并发度。
    • 适合需要灵活配置线程池大小和行为的应用。
  • ForkJoinPool:

    • 适合处理大规模数据集上的并行计算任务。
    • 适合实现复杂的分治算法。
    • 适合需要高效利用多核处理器的应用。

性能和资源管理

  • ThreadPoolExecutor:

    • 可以通过调整 corePoolSize 和 maximumPoolSize 来控制资源使用。
    • 适用于对线程数量和任务队列大小有明确需求的场景。
  • ForkJoinPool:

    • 自动平衡线程间的负载,减少线程竞争。
    • 适用于需要最大化处理器利用率的场景。

总结 

  • 如果你需要处理大量的异步任务,并且这些任务是独立的,那么 ThreadPoolExecutor 是一个更好的选择。
  • 如果你的任务可以被分解成更小的子任务,并且这些子任务可以并行执行,那么 ForkJoinPool 会更加合适。

 

标签:task,ForkJoinPool,适合,任务,线程,比较,ThreadPoolExecutor
From: https://www.cnblogs.com/anpeiyong/p/18422622

相关文章

  • 优思学院|精益管理和六西格玛之详细比较
    想提升自己,但不知道该学习什么?很多人都有这样的困惑,常常问:“精益管理和六西格玛到底有什么区别?”当然,学习任何知识对我们都有帮助,但学习什么知识对我们的帮助最大?这是我们真正关心的问题。因此,大家需要从工作的需求、升职的要求等方面进行衡量。我们应该学习哪套方法、工具和理......
  • python 比较两个或多个时间,获取最大的时间(最近的时间)
    自定义的公共函数importdate_timedefstr2datetime(date_time,form="%Y-%m-%d%H:%M:%S"):_datetime=datetime.datetime.strptime(date_time,form)ifisinstance(date_time,str)elsedate_timereturn_datetimedefdatetime2str(date_time,form=&q......
  • 快速比较两个数据库所有表的字段是否一致
    背景在开发时,常常会有开发环境,测试环境,生产环境。当开发环境中的数据库结构发生变化时,往往需要同步到测试环境和生产环境,但是有时候会忘记同步了。那么,如何快速判断两个数据库的所有表字段是否一致呢?需要工具:navicat(或类似数据库工具),BeyondComapre(或类似文本比较工具)。导出数......
  • 六种主流ETL工具的比较与Kettle的实践练习指南--MySQL、hive、hdfs等之间的数据迁移
            在数据集成和数据仓库建设中,ETL(Extract,Transform,Load)工具扮演着至关重要的角色。本文将对六种主流ETL工具进行比较,并深入探讨Kettle的实践应用。一、六种主流ETL工具比较1.DataPipeline设计及架构:专为超大数据量、高度复杂的数据链路设计的灵活、可扩......
  • 浮点数的比较
    浮点数与"零值"精度损失:浮点值与实际值不等,可能偏大可能偏小,都属于精度损失验证浮点数是否存在精度损失验证浮点数的差值是否存在精度损失浮点数直接比较验证结论:浮点数在进行比较时,绝对不能使用双等号==来进行比较.浮点数本身有精度损失,进而导致结果可能有细......
  • LVS三种负载均衡模式的比较
    文章目录三种模式对比三种模式对比LVS-NATLVS-DRLVS-TUN服务器操作系统可以使用任何支持TCP/IP的操作系统大多数常见的操作系统都可以使用需要支持IP隧道技术的操作系统服务器网络需要私有网络,所有真实服务器(RS)必须位于同一局域网内同样需要局域网,但RS可以使用公网......
  • 【高中数学/对数函数/大小比较】设a=2/ln2,b=3/ln3,c=e,则a,b,c的大小关系为?
    【问题】设a=2/ln2,b=3/ln3,c=e,则a,b,c的大小关系为?【出处】《高考数学极值解题大招》P38第9题中原教研工作室编著【解答】e=3/lne,故三者的共同的构造函数为f(x)=x/lnx了解了单调性就好解题。f'(x)=(lnx-1)/(lnx)^2 由此可知x=e时,f'(x)=0;x>e时,f'(x)>0;x<e时,f'(x)<0.故x=e是f......
  • Cesium 比较常用的几个方法
    根据经纬度获取高程/***根据经纬度获取高程*@param{mars3d.Map}map*@param{number}lng*@param{number}lat*/asyncfunctiongetHeightByLngLat(map,lng,lat){if(!lng||!lat)returnundefined;letpositions=[Cesium.Carto......
  • 推荐一个比较好用的工具Microsoft PowerToys
    MicrosoftPowerToys是一组实用工具,可帮助高级用户调整和简化其Windows体验,从而提高工作效率。虽然刚刚使用这个工具不久,但是已经能初步感受到它的强大,接下来我就对于我使用的几个功能进行简单介绍。屏幕截取这个功能在日常工作中应该是经常会用到,在学生时代,使用这个功能......
  • YAML 与 JSON、XML 比较及 YAML 使用最佳实践
    YAML(YAMLAin'tMarkupLanguage的递归缩写)是一种人类可读的数据序列化格式,通常用于配置文件、数据交换和设置管理。它简洁且易于读写,尤其适合在编程语言之间传递配置数据。以下是一些YAML的基本概念和语法示例:基本语法键值对:name:JohnDoeage:30嵌套:person:name:JohnDoe......